2020年6月16日火曜日

自動ツイートプログラムVer2の中身

自動ツイートするプログラム作成の件です。技術的なことをソースコード込みで、書いてしまうと、アプリの性質上、悪用されてしまう可能性があります。そのため、概要のみにさせていただきます m(_ _)m。一番印象に残った苦労は、Twitterの新規ログインのメッセージを消すことです。原因を類推して、解決しました。
新規ログインのお知らせがたくさん出て困っています(T_T)
■Twitter API使用の検討

自動ツイートプログラムは、Twitter APIの利用申請をすれば、簡単に作れるかもしれません。しかし、テストアカウントと本番アカウントの両方に申請するのは面倒ですし、何より申請に時間がかかるのが困ります。仕事ではないので、申請を待っている間に、こちらの熱が冷めてしまいそうです (^_^;)。

■自動テストを見越して(PythonとSelenium)

色々考えて、PythonとSeleniumの組み合わせが良さそうと思いました。Selenium は、 Webアプリケーションをテストするためのツール群です。Seleniumを覚えるとWebアプリのテストもできます。これは今後の応用にも利用でき、魅力的です。


■作業ログ(長いので文字を小さくします)

困ったところを箇条書きにすると以下の通りです。DOM、CSS、Python、全てちゃんと勉強したことがないためです。詳しい読者の方は、こんなので躓いたのか、と思われるかもしれません m(_ _)m。本業ではないので、大目に見て頂けると助かります m(_ _)m。また優しく指南していただけると嬉しいです m(_ _)m

全般的に、Seleniumに関する説明は複数あります。バージョンの差違などにより、方法が複数あるのでしょうか。 これらを順番に試すようになりました。環境も3回変えて、実施しました。そのため、こちらの環境では上手く行ったのに、あちらの環境では上手く行かないなどあり、躓いた箇所(回数)も多いです。
  • 動作環境の整備
    • Pythonをインストールします
    • Pythonのパッケージをインストールをするpipコマンドを利用して、selenium絡みをインストールします
      • pipはプロキシーの設定を別途しないと行けません。プロキシーの設定が必要な人はお気を付けください
      • pip自身のバージョンアップを要求されることもありました
    • Seleniumのモジュールは別途、ダウンロードするのだと思います
      • pipで同時にインストールされるような記述もありましたが、私はダメでした
  • ログイン
    • ログイン・パスワードを入力します
      • 入力する場所が良く分かりません
      • 以前、作ったプログラムで指定したところと同じ場所を指定したところ、動いたので、これで良しとします (^_^)
  • ツイート
    • ツイートする場所は、テキストボックスではない
      • テキストボックスではないところに、文字が入力できることを知りませんでした
      • どこにツイート文を送ればよいのか分かりません
        • Choromeのデバック機能でDOMツリーを見る方法を知り、色々試しましたが、はっきり分かりませんでした
        • クリックすると、DOMの構造が変化するように思います。
        • 色々試し見て動きました。動いているから良いや、という感じです
    • 文字入力が遅い(まま)
      • Seleniumのsend_keysは遅いことで有名なようで、JavaScriptを使って速くするのが常套手段のようです。ログイン画面では成功しましたが、ツイートでは上手く行きません。ツイートにしていている場所など、間違っているけど、たまたま動いているからなのかもしれません
  • ログアウト
    • ログアウト画面に遷移させるボタンが見つけられません。ログアウトのページをじかに指定して、遷移させることで対処しました
    • ログアウトの確認ダイアログでの「ログアウト」をxpathで見つけます。xpathでの指定の仕方が悪いのか、実行時の環境により、2番目の要素の時と3番目の要素の時があるようです。IDパスワードを入力してログインしたときと、クッキーで自動ログインするときで挙動が違うように思っていますが、突き詰めていません。最後の要素をクリックする、で対処しました。
■Twitterに「新規のログイン」の通知が毎回出る

紆余曲折しながら、ログイン、ツイート、ログアウトが出来るようになりました。しかし、ログインするたびに「新規のログインを検出」したとメッセージが出てしまいます。

このメッセージが出る原因は分からないのですが、挙動から以下のように判断しました。
  • Twitterサーバーは、接続してきたWebブラウザに対してクッキーを送ります
  • 以降の接続で、Webブラウザは、クッキーをTwitterサーバーに送信します。
    • クッキーを送ってきたWebブラウザは、2回目以降の接続だと思い、何もしません
    • クッキーを送ってこないWebブラウザは、新規のログインだと認定し、登録されたメールアドレスに、その旨通知します
どうやらSeleniumでのアクセスは、(デフォルトでは)クッキーなどの情報は保存されないようです。

クッキーを明示的に操作する方法を調べたのですが、どのように応用して良いか、理解できませんでした m(_ _)m。 絶望しました。

諦めきれず、検討していたら、Chromeのユーザープロファイルを指定(利用)する方法に気づきました。この設定方法も2種類あり、一方はうまく動きませんでした。

最終結論として、これで、全部の問題はクリアしました。以前のActiveXの版に比べて、ツイート文の入力が遅くなったのは、仕方がないと思い、諦めています。

0 件のコメント:

コメントを投稿