TwitterをCookieで操作する

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

#Cookieについて

https://belltree.life/tweet-camouflage-by-cookie/

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

#ロジック

https://note.com/kohnoselami/n/nb60223d297e5

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

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

- 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つの記事を見つけました。

https://sandas.hatenablog.com/entry/2019/02/22/011328

https://stackoverflow.com/questions/39757096/logging-into-a-twitter-using-python3-and-requests

上は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が見つけられなく詰んだ、、、と思ってたところ

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

https://teratail.com/questions/309032

『パスワードリセットのサイトが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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/54dd6fa5-16c4-bb05-0c9f-2d89e7be018e.jpeg)


ログイン成功！！

```
{
    '_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)
```
こんな感じで取得できます

#必要な情報は揃った
https://note.com/kohnoselami/n/nb60223d297e5

この方の記事を見る限り

```
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=(ここにct０)'
}
```

こういう事でしょうか

#とりあえずこれでAPIを叩けるかやってみる
```
headers = {
   'x-csrf-token': '（ここにct0）', 
   'authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAAF7aAAAAAAAASCiRjWvh7R5wxaKkFp7MM%2BhYBqM%3DbQ0JPmjU9F6ZoMhDfI4uTNAaQuTDm2uO9x3WFVr2xBZ2nhjdP0',
   'cookie': 'auth_token=(ここにauth_token); ct0=(ここにct０)'
}

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

requests.post('https://twitter.com/i/api/1.1/statuses/update.json', headers=headers, params=params)
```
![S__2940931.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5b8edde4-284d-d125-6dba-583eabfa50e9.jpeg)



ツイートできた！！！！！！

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

おわり

#参考記事

https://belltree.life/tweet-camouflage-by-cookie/

https://note.com/kohnoselami/n/nb60223d297e5

https://sandas.hatenablog.com/entry/2019/02/22/011328

https://www.libertyspecialtymarkets.com/static/2020-07/Liberty-specialy-markets-cookies.pdf

https://stackoverflow.com/questions/44894394/logic-using-curl-php-and-twitter-without-using-api

https://stackoverflow.com/questions/39757096/logging-into-a-twitter-using-python3-and-requests

https://gist.github.com/igorbrigadir/de2a6cf16dfcdd4506816ef9a89aaa18