示例#1
0
 //ツイッターテキストは140文字に成形しなおす URL等文字制限に入らない文字列はextensionUrlTextに入れる
 static public void Tweet(this TwitterCon twitterCon, string tweetText, string extensionUrlText = "")
 {
     //140文字に収める
     if (tweetText.Length > 140)
     {
         tweetText = tweetText.Substring(0, 139);
     }
     try
     {
         twitterCon.tokens.Statuses.Update(tweetText + "\r\n" + extensionUrlText);
     }
     catch
     {
         Console.WriteLine("Error:ツイート失敗 " + DateTime.Now.ToString("yyyyMMdd") + tweetText);
     }
 }
        static void Main(string[] args)
        {
            var con      = new YahooFinanceDbContext();    //時価総額取得用のDBクラス
            var tweetCon = new TwitterCon();               //ツイッター操作クラス
            var kaiziCon = new KabutanPostgreSQLContext(); //開示用PostgreSQL操作クラス
            IEnumerable <KaiziItem> kaiziItems;            //開示内容保存用List
            string latestPdfURL = kaiziCon.LatestPDFURL(); //最もDatetimeが新しいPDFのURL(同時刻の場合は主キーIDが最新のもの優先)

            int  kabutanMaxPage = 99;                      //株探適時開示MAXページ数
            bool pageBreakFlag  = true;

            while (true)
            {
                //trueならツイート&DB登録を続ける
                pageBreakFlag = true;
                //最新PDFURL又は指定ページ数に到達するまで適時開示のツイート&DB登録
                for (int page = 1; page <= kabutanMaxPage && pageBreakFlag; page++)
                {
                    //株探適時開示ページ取得
                    kaiziItems = KaiziClient.WebDownloadKaiziItems(page);
                    //株探ツイート+DB操作
                    foreach (var kaiziItem in kaiziItems)
                    {
                        //通知済の時点でツイートとDB登録をしない
                        //(ツイートはしないけどDBだけ登録処理書くかも それは別プログラム?)
                        if (kaiziItem.PDFURL == latestPdfURL)
                        {
                            //DB登録&ツイート終了
                            pageBreakFlag = false;
                            break;
                        }
                        //最新の時価総額取得
                        var  capTradeIndex = con.TradeIndexs.Where(x => x.code == kaiziItem.Code).OrderByDescending(x => x.date).FirstOrDefault();
                        long latestMarketCapitalization = 0;
                        if (capTradeIndex == null)
                        {
                            latestMarketCapitalization = 0;
                        }
                        else
                        {
                            latestMarketCapitalization = capTradeIndex.marketCapitalization;
                        }
                        //DB登録
                        if (kaiziCon.IsDuplicatePDFURL(kaiziItem.PDFURL) == false)
                        {
                            kaiziCon.KaiziItems.Add(kaiziItem);
                        }
                        //ツイート関連
                        string strMarketCap = "-";
                        //0除算エラー回避
                        if (latestMarketCapitalization != 0)
                        {
                            strMarketCap = string.Format($"{latestMarketCapitalization / 100000000.0:0.00}");
                        }
                        var tweetText = string.Format($"{kaiziItem.Code} {kaiziItem.Name} {strMarketCap}億\r\n{kaiziItem.Title}");
                        tweetCon.Tweet(tweetText, kaiziItem.PDFURL);
                        Console.WriteLine($"{DateTime.Now} Tweet" + tweetText + "\r\n" + kaiziItem.PDFURL);
                    }
                    //規制対策
                    Thread.Sleep(500);
                }
                //適時開示DB更新
                kaiziCon.SaveChanges();
                //最新通知済開示内容を記録
                latestPdfURL = kaiziCon.LatestPDFURL();       //最もDatetimeが新しいPDFのURL(同時刻の場合は主キーIDが最新のもの優先
                Thread.Sleep(10000);
            }
        }