2020-09-13 07:49 | カテゴリ:勉強や投資情報
投資情報BOTに昨日こんな修正をして、
投資情報BOTで企業HP更新ツイートに更新内容のHP画面の画像ファイルを添付したツイートをするように修正しました
最後にPDFは画像添付出来ない問題があるので、今後対応するって書いてましたが、下調べしててソースをいじってたら、出来ちゃいました。

これまた、パズルを解くように、結構沢山の問題が解決しながらやっていったので、備忘録です。
※プログラムに興味ない人は最後の「4.蛇足」だけ読んでくれればいいです。

1.PDFファイルをダウンロードする

色々仕様を考えた結果、WEB上にあるPDFファイルをそのまま画像にするのは無理で、一旦自分のローカル環境にダウンロードしないといけないって分かったので、まずはファイルをダウンロードする方法です。

↓三つやり方が紹介されてて、一番下のにしました。
ファイルをダウンロードし保存する
※第五引数をfalseにすると、ダウンロード中画面が表示されなくなります。

2.PDFファイルを画像変換する

PDFを扱うとなると、SE経験者なら「はぁ・・・サードパーティの有料ソフトを買わないといけないな・・・」って思います・・・が・・・最近は有志がフリーソフトでPDFを扱うパッケージ(ライブラリ)を公開してくれています。
.Netフレームワークでは「GhostscriptSharp」というのが無料で公開されているパッケージとなります。
VisualStudioではパッケージ管理はNuGetという機能で簡単に、検索・インストール・アンインストールが出来ます。

↓やり方とサンプルコードはこちら
【C#-制御系】PDFを画像(jpg)に変換

3.CoreTweetAPIで複数画像ツイート

WEB画面をキャプチャした画像を添付してツイートの場合は、添付ファイルは1枚でしたが、PDFってなると、何ページかある事が想定されます。
そしてツイッターの仕様では添付画像の上限は4枚となっています。
ですので、PDFの1~4ページまでをツイートする仕様としました。

となると、塩漬けマンが使っているCoreTweetというAPIで、どのように複数画像をツイートするのか分からなくて調べました。
誰も迷わない事なのか?仕様書を皆読んでるのか?全然ネットに情報が落ちてなくて、これが一番大変でした。
↓んで、ようやく見つけたのがここ
CoreTweet で複数画像投稿する

↓上記ではよく分からないので、上記にリンクが貼ってあったCoreTweet公式のHPへ
画像や動画をアップロードしてツイートする方法

ここを見ると、
// Tokens t;
MediaUploadResult first = t.Media.Upload(media: new FileInfo(@"C:\NicePicture.jpg"));
MediaUploadResult second = t.Media.Upload(media: new FileInfo(@"C:\GoodPicture.jpg"));

ってあって、「まじか・・・画像一枚づつツイッターにアップロードして、それぞれにMediaIDを得るの?!」って思いました。
「それをどうツイートするんだろう?」って思ったら、答えがこれ。
Status s = t.Statuses.Update(
status: "My nice pictures",
media_ids: new long[] { first.MediaId, second.MediaId }
);

・・・四枚画像ファイルがあったら、4つの引数をセットするのか・・・引数の数が可変って実装しにくいな・・・long型の配列に格納して渡せばいいのかな・・・
一応、上記の公式マニュアルには、非同期メソッドを利用する場合は、 Task.WhenAllでスマートに引数をセットする方法が書かれてましたが、諸事情により非同期メソッドは利用出来ないし、上限4枚って決まってるならこれでいいやと、以下のようなスマートでないソースになりました。

※imageFilesは引数で渡しているFileInfoクラスのListで、画像ファイルまでのフルパスが設定されている
20200912複数画像ツイート実装例

塩漬けマンは現役時代からダメプログラマーだったので、スマートで凄いコードを書くよりも、誰が見ても分かりやすいコードを書くように心がけていました。
上記のコードだと、imageFilesのListの要素数が何個であろうと、例外エラーを起こさず、最大4つまでの画像を添付してツイートします。

ということで、以下のように、ツイートにPDFの画像ファイルを添付出来るようになりました。


4.蛇足

C#等のプログラムでツイートするには、本来であればツイッター社の公式のAPI仕様書を読んで、凄く大変なプログラムをゴリゴリ書かなければいけません
※チラっと見てみたら、HttpWebRequestクラスを使ってPOSTしたり、WebResponseクラスを使ったりと、うんざりするような複雑で大変なコードを書かないといけませんでした。

しかし、有志の人が簡単にツイート出来るパッケージ(塩漬けマンが使っているのはCoreTweet)を作って、無料公開してくれており、さらにマイクロソフトもNuGetというパッケージ管理機能で、有志が作ってくれた無料パッケージを誰でも簡単に迷うことなく検索・インストール出来るようにしてくれています。
NuGetにあるという事は、マイクロソフトが公式に認可したパッケージという事で、バックドア等が仕込まれておらず安全という事でもあります。

さらにCoreTweetの仕様書すら読まなくていいように、プログラマーの人がブログ等でコード例を載せてくれています。

なので、一切の仕様書を見る事無く、適当にググって、コード例を見つけて、コピペでソフトウェア開発が出来る世の中となっています。

便利なパッケージを作ってくれた人にも、その使い方をご教授してくれているにも感謝です。
プログラマの世界というのは、その黎明期から営利を目的とせず、無償でソフトウェアを提供するという「性善説に基づいた助け合いの精神」が根底にあります。
塩漬けマンが投資情報BOTという、他人より早く気づければ、もしかしたら元手が何倍にもなるような情報を最速でツイートするアカウントを公開しているのも、プログラマの世界の「性善説に基づいた助け合いの精神」が根底となっています。
これは「他人の金をいかに奪うか」という悪意に満ちた株式投資の世界とは真逆の思想です。

↓コメントはツイッターからどうぞ ※忙しいと申し訳ありませんが、コメント返信出来ない事があります。
ツイッターアイコン1

↓応援クリックをして頂けたら感謝です。


↓拍手には特に意味はないのですが、ブログ内容の良し悪しパロメータとして使っています(´・ω・`)
トラックバックURL
→https://shiodukeman.jp/tb.php/2836-b551454c