Ejemplo n.º 1
0
        /// <summary>
        /// 指定したアカウントのツイート, フォロー等を取得する
        /// 新規ログイン向け
        /// 常に最大数のツイートを取得する
        /// </summary>
        /// <param name="user_id"></param>
        /// <returns></returns>
        public async Task OneAccount(long user_id)
        {
            var timeOut = Task.Run(async() => { await Task.Delay(60000).ConfigureAwait(false); Environment.Exit(1); });

            var t = await db.SelectUserStreamerSetting(user_id).ConfigureAwait(false);

            if (!t.HasValue)
            {
                return;
            }
            //無条件でAPIの最大数のツイートを取得するためにToken以外は捨てる
            var s = new UserStreamer(new UserStreamer.UserStreamerSetting()
            {
                Token = t.Value.Token
            });

            var friend   = s.RestFriend();
            var block    = s.RestBlock();
            var tweet    = s.RestMyTweetMax();
            var cred     = s.VerifyCredentials();
            var timeline = s.RestTimeline();
            await Task.WhenAll(friend, block, tweet, cred, timeline).ConfigureAwait(false);

            Console.WriteLine("{0}: API access completed.", user_id);

            //ツイート等の取得を行ったことをDBに保存する
            var savesetting = s.Setting;

            savesetting.rest_my_tweet = false;

            var settingTask   = db.StoreUserStreamerSetting(savesetting);
            var crawlInfoTask = s.LastReceivedTweetId != 0
                ? db.StoreCrawlInfo_Timeline(s.Token.UserId, s.LastMessageTime.ToUnixTimeSeconds())
                : Task.CompletedTask;
            await Task.WhenAll(settingTask, crawlInfoTask, UserStreamerStatic.Complete()).ConfigureAwait(false);

            Console.WriteLine("{0}: Profile stored\t{1}, {2}", user_id, friend.Result, block.Result);
            Counter.PrintReset();
        }
Ejemplo n.º 2
0
        /// <summary>
        /// サインインした全アカウントのツイート, フォロー等を取得する
        /// 常に最大数のツイートを取得する
        /// </summary>
        /// <returns></returns>
        public async Task <int> Proceed(bool getTweet = false)
        {
            var tokens = (await db.SelectUserStreamerSetting(DBHandler.SelectTokenMode.All).ConfigureAwait(false)).ToArray();

            if (tokens.Length > 0)
            {
                Console.WriteLine("App: {0} Accounts to REST", tokens.Length);
            }
            var RestProcess = new ActionBlock <Tokens>(async(t) =>
            {
                //無条件でAPIの最大数のツイートを取得するためにToken以外は捨てる
                var s = new UserStreamer(new UserStreamer.UserStreamerSetting()
                {
                    Token = t
                });
                await s.RestFriend().ConfigureAwait(false);
                await s.RestBlock().ConfigureAwait(false);
                if (getTweet)
                {
                    await s.RestMyTweet().ConfigureAwait(false);
                }
                await s.VerifyCredentials().ConfigureAwait(false);
            }, new ExecutionDataflowBlockOptions()
            {
                MaxDegreeOfParallelism = config.crawl.RestTweetThreads,
                BoundedCapacity        = config.crawl.RestTweetThreads << 1
            });
            var sw = Stopwatch.StartNew();

            foreach (var t in tokens)
            {
                await RestProcess.SendAsync(t.Token).ConfigureAwait(false);

                while (true)
                {
                    if (sw.ElapsedMilliseconds > 60000)
                    {
                        Counter.PrintReset();
                        GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; //これは毎回必要らしい
                        GC.Collect();
                        sw.Restart();
                    }
                    //ツイートが詰まってたら休む
                    if (UserStreamerStatic.NeedConnectPostpone())
                    {
                        await Task.Delay(1000).ConfigureAwait(false);
                    }
                    else
                    {
                        break;
                    }
                }
            }
            RestProcess.Complete();
            await RestProcess.Completion.ConfigureAwait(false);

            await UserStreamerStatic.Complete().ConfigureAwait(false);

            Counter.PrintReset();
            return(tokens.Length);
        }