LoginSignup
8
6

More than 1 year has passed since last update.

TwitterをCookieで操作する

Last updated at Posted at 2021-07-09

目標

Cookieを使用してTwitterをプログラムから操作する
ログインしてTwitter認証から操作までを行います

Cookieについて

こちらの方がTwitterをCookieで操作する事について分かりやすい記事をあげています。
とても参考になりました。

ロジック

こちらの方がやりたいことに近いことをしてました

この記事からわかることは

  • authorization
  • auth_token
  • ct0

最低限この3つがあればTwitterを操作できるということです
authorizationは固定らしいのでauth_tokenとct0が必要です

ちなみにauthorizationは

Bearer AAAAAAAAAAAAAAAAAAAAAF7aAAAAAAAASCiRjWvh7R5wxaKkFp7MM%2BhYBqM%3DbQ0JPmjU9F6ZoMhDfI4uTNAaQuTDm2uO9x3WFVr2xBZ2nhjdP0

これらしいです
ソース1:https://note.com/kohnoselami/n/nb8ef0eea5831
ソース2:https://sandas.hatenablog.com/entry/2019/02/22/011328

auth_tokenを取得する

ではどうすればその2つを取得できるか
それにはまずログインする必要があります

調べたところ下記の2つの記事を見つけました。

上はRubyで下はPythonです

https://twitter.com/sessions
こちらに下記の2つをPOSTするようです
※全てPythonで使える形式に変換してます

{
    'session[username_or_email]' : (Twitterのユーザーネーム),
    'session[password]' : (Twitterのパスワード),
    'remember_me' : '0',
    'return_to_ssl' : 'true',
    'redirect_after_login' : 'https://tweetdeck.twitter.com/?via_twitter_login=true',
    'authenticity_token' : authenticity_token
}
{
    'cookie' : '_mb_tk=' + authenticity_token,
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0'
}

ログインにはauthenticity_tokenが必要らしいんですが古い記事だと同じようにやっても
authenticity_tokenが見つけられなく詰んだ、、、と思ってたところ

なんとかそれらしき記事を見つけることができました

『パスワードリセットのサイトがHTMLのままだったのでそちらのサイトのソースを見てみたところtokenがありましたのでそちらにアクセスしてトークンを引っ張ってきてそのトークンでセッションログインを行ったところ認証情報を取得できました』とのこと。

あった、、、、、、

https://twitter.com/account/begin_password_reset
こちらがパスワードリセットのサイトです

#Python

url = "https://twitter.com/account/begin_password_reset"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
print(soup.find('input').get("value")) 

これでauthenticity_tokenを取得できました

ログイン情報をPOSTする

import requests
from bs4 import BeautifulSoup

#authenticity_tokenの取得
url = "https://twitter.com/account/begin_password_reset"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
authenticity_token = soup.find('input').get("value")

#ヘッダーの用意
headers = {
    'cookie' : '_mb_tk=' + authenticity_token,
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0'
}

#データの用意
data = {
    'session[username_or_email]' : (Twitterのユーザーネーム),
    'session[password]' : (Twitterのパスワード),
    'remember_me' : '0',
    'return_to_ssl' : 'true',
    'redirect_after_login' : 'https://tweetdeck.twitter.com/?via_twitter_login=true',
    'authenticity_token' : authenticity_token
}

requests.post('https://twitter.com/sessions',headers=headers,data=data)

S__2940933.jpg

ログイン成功!!

{
    '_twitter_sess': '', 
    'ads_prefs': '', 
    'auth_token': '', 
    'guest_id': '', 
    'kdt': '', 
    'personalization_id': '', 
    'remember_checked_on': '', 
    'twid': ''
}

POSTのレスポンスからCookieを取り出します
Cookieはこんな感じです。値は消してます

欲しかったauth_tokenがありますね:metal:

あとはct0です

ct0を取得する

まずct0ってなに??

このCookieは、ソーシャルメディアのTwitter統合および共有機能のために設定されています。
有効期限:セッションの終了
プロバイダー:Twitter
ドメイン:asml.com、asml.csod.com

だそうです
よく分かりませんでした

Twitter公式ページならどこでもct0がありました
https://developer.twitter.com/en
https://developer.twitter.com/en/docs/twitter-api
https://help.twitter.com/ja/rules-and-policies/twitter-rules
など

#Python

url = "https://developer.twitter.com/en"
session = requests.session()
response = session.get(url)
ct0 = response.cookies.get('ct0')

print(ct0)

こんな感じで取得できます

必要な情報は揃った

この方の記事を見る限り

headers = {
   'x-csrf-token': '',
   'authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAAF7aAAAAAAAASCiRjWvh7R5wxaKkFp7MM%2BhYBqM%3DbQ0JPmjU9F6ZoMhDfI4uTNAaQuTDm2uO9x3WFVr2xBZ2nhjdP0',
   'cookie': 'auth_token=; ct0='
}

これに取得した情報を当てはめていけば良さそうです。

x-csrf-tokenの生成方法がわからないと記載されてたのでまたまた一生懸命調べましたら下記の記事が見つかりました。
https://gist.github.com/igorbrigadir/de2a6cf16dfcdd4506816ef9a89aaa18

『x-csrf-tokenリクエストヘッダーとct0Cookieは同じ値である必要があります。』
だそうです

headers = {
   'x-csrf-token': '(ここにct0)', 
   'authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAAF7aAAAAAAAASCiRjWvh7R5wxaKkFp7MM%2BhYBqM%3DbQ0JPmjU9F6ZoMhDfI4uTNAaQuTDm2uO9x3WFVr2xBZ2nhjdP0',
   'cookie': 'auth_token=(ここにauth_token); ct0=(ここにct0)'
}

こういう事でしょうか

とりあえずこれでAPIを叩けるかやってみる

headers = {
   'x-csrf-token': '(ここにct0)', 
   'authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAAF7aAAAAAAAASCiRjWvh7R5wxaKkFp7MM%2BhYBqM%3DbQ0JPmjU9F6ZoMhDfI4uTNAaQuTDm2uO9x3WFVr2xBZ2nhjdP0',
   'cookie': 'auth_token=(ここにauth_token); ct0=(ここにct0)'
}

params = {'status':'これはテストです'}

requests.post('https://twitter.com/i/api/1.1/statuses/update.json', headers=headers, params=params)

S__2940931.jpg

ツイートできた!!!!!!

見てくださった方ありがとうございました。

おわり

参考記事

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6