目標
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)
ログイン成功!!
{
'_twitter_sess': '',
'ads_prefs': '',
'auth_token': '',
'guest_id': '',
'kdt': '',
'personalization_id': '',
'remember_checked_on': '',
'twid': ''
}
POSTのレスポンスからCookieを取り出します
Cookieはこんな感じです。値は消してます
欲しかったauth_tokenがありますね
あとは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)
ツイートできた!!!!!!
見てくださった方ありがとうございました。
おわり
参考記事