2019/07/30頃から、TweetKeyPressでツイート時に以下の画像のようなエラーが発生することが増え、気になって調べていたところCoreTweetが問題であったので備忘録。

目次

環境

  • OS: Windows 10 1809 (Build 17763.678)
    (winverコマンドで確認)
  • TweetKeyPressバージョン: 2015/06/27更新版 (追記版) http://avagj.info/wordpress/?p=216
  • ILMergeバージョン: 2.12.803.0
    (ILMerge.exeのプロパティ→ファイル バージョンで確認)
  • Visual Studio 2019 Community

エラー内容

System.Net.WebException: 接続が切断されました: 送信時に、予期しないエラーが発生しました。。 ---> System.IO.IOException: 転送接続からデータを読み取れません: 既存の接続はリモート ホストに強制的に切断されました。。 ---> System.Net.Sockets.SocketException: 既存の接続はリモート ホストに強制的に切断されました。

スタックトレースまで全部書かないけれど、CoreTweetのツイート時(CoreTweet.Request.HttpPost)にエラーが発生している。
原因はTwitterがTwitterAPIへのTLS1.0, 1.1での接続を無効化して、TLS1.2を必須としたため。

対策概要

GitHubにソースコードがアップされていたので(多分作者本人)、それをクローンさせていただいて、VSでビルド。そのあとCoreTweetのDLLを置き換えて、ILMergeでDLLをexeにマージするというのが今回の流れ。

やり方

ILMergeとVisual Studioはインストール済みで利用可能であることを前提として話を進めます。

0. TweetKeyPressを終了してください。

タスクバーに常駐している場合は、タスクバーのTweetKeyPressのアイコンを右クリックし、「終了する」を選択してTweetKeyPressを終了してください。

1. Visual Studioを起動し、GitHubからプロジェクトをクローンします。


Visual Studio 2019を起動し、画面右側の「作業の開始」から「コードを複製またはチェックアウトする」を選択します。
その後、リポジトリの場所欄にhttps://github.com/nahc-ak/TweetKeyPress.gitと入力して右下「複製(C)」を押します。
必要に応じてローカル パスは設定してください。

2. TweetKeyPress.slnをダブルクリックしてプロジェクトを開きます。

画面が切り替わって、左側に画像のようなフォルダ一覧が表示されたら、TweetKeyPress.slnをダブルクリックして開いてください。

3. プロジェクトが開いたら、「開始」を押してプロジェクトをビルドします。

また画面が切り替わって、左側が画像のようになったら(ソリューション 'TweetKeyPress'と表示されていたら)、画面上部の「開始」をクリックしてプロジェクトをビルドしてください。

4. 起動したTweetKeyPressをVisual Studio側から強制終了します。

ビルドが終わると、TweetKeyPressが起動し、画像のような赤い■がVisual Studioの上部に表示されます。
この赤い■を押して終了させるか、Shift+F5を押してTweetKeyPressを終了させてください。
上記0. TweetKeyPressを終了してください。で解説したような方法で終了させてもいいのですが、その方法で終了するとVisual Studio側でエラーを吐く可能性があります。(ツイートしようとしてWebExceptionをキャッチするので)

5. TweetKeyPressのフォルダーを開いてexeファイルを探してください。


左側のソリューション エクスプローラーからTweetKeyPressを右クリックして、エクスプローラーでフォルダーを開く(X)をクリックし、フォルダーを開いてください。
開いたフォルダーから順にbinDebugと選択して、TweetKeyPress.exe`があるフォルダーを開いてください。

6. 対応済みのCoreTweet.dllをダウンロードし、配置してください。

このページの「こちら」をクリックし、対応されたCoreTweet.dllをダウンロードしてください。
なお、CoreTweet自体も自身で対応したいという方はこちらで詳しく解説されています。ありがとうございます。

ダウンロード後、先ほど開いたフォルダにダウンロードしたCoreTweet.dllファイルをコピー・ペーストして上書きしてください。

6. コマンドプロンプトを開き、DLLファイルとexeファイルをマージしてください。

先ほど開いたフォルダでコマンドプロンプトを開き、以下のコマンドを実行(コピーしてEnter)してください。
なお、コマンドプロンプトを開くときはエクスプローラーのアドレス欄にcmdと打てば開いているフォルダをカレントディレクトリ(現在の位置)として開くことができます。

"C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe" /wildcards /out:TweetKeyPress_DLLMerged.exe TweetKeyPress.exe *.dll /targetplatform:v4,"C:\Windows\Microsoft.NET\Framework\v4.0.30319"

7. TweetKeyPress_DLLMerged.exeファイルが出力されていれば成功です。

開いているフォルダにTweetKeyPress_DLLMerged.exeファイルがあれば(出力されていれば)成功です。
TweetKeyPressをスタートアップなどに配置している場合はそれらと置き換えてください。(ファイル名は変えて構いません)

もしうまくいったか気になる場合は、TweetKeyPressを起動後、タスクバーから右クリックして「今すぐツイートする」をクリックしてみてください。成功していればツイートされます。

参考サイトなど

記事執筆にあたり参考にさせていただきました。ありがとうございます。

あとがき

なうぷれTunesV2もツイートできないというのを上記参考サイトで挙げたツイートで確認したので、てっきり最近動作していない理由はそれだろうと思ってCoreTweet.dllを差し替えて起動しようとしても起動せず(即座に終了する)、あれーと思っていたらconfig.jsonが0バイトになっていて、再度連携しなおしたら普通に通ったという…
イベントビュアーを見てたら、ちょうどconfig.jsonの更新時刻にエクスプローラーが応答停止→終了しているのでそれが原因かなと思いますが。CoreTweetそのままでなぜ動作しているのだろうか…
なお、どうも0バイト起動時に一応System.NullReferenceExceptionを吐いて終了しているみたいですね…イベントビュアーでしか確認できない(ユーザーに対して全くレスポンスがない)のは気になるところですが。