ツイッターの自動懸賞応募botを作るまで python　

pythonを学び始めて3週間経った　基礎構文なども身についてきたため、なにか作りたいと思いアイデアを探っていたところ、
どうやらツイッターにおいてアカウントを自動bot化し、自動でフォローなどが出来ると知り、懸賞ツイートに自動で応募出来ないかと思った

調べてみるそういうコードがちらほら見つかるが、どうやらリツイートされたものまで拾ってきて、さらにはそのリツイートした全く関係ないユーザーをフォローしてしまうコードであったり、以下のようなツイートへの対処はどのコードも考えられてなかった

プレゼント企画ツイート（特に認証アカウントの）にはフォロー＆リツイートをすれば参加できるものが圧倒的に多い。ただ「こちらのアカウントも併せてフォローしてください！！　@～～～　@ー－－－－」　というように企画に関連するユーザーのフォローも促すツイートもちらほら見かける。

公式アカウントのプレゼント企画は当選確率は低いかもしれないが、信憑性が高いので逃したくない

今回はこういうツイートにも対応しているような、メンションを正規表現で抽出してフォローするようにしたいと思う

### BOTを作る３つの流れ
- ツイッターのAPIを取得する
- 動かしたいコードを書く
- タスクスケジューラで定期実行する

### まず何をすればよいのか
まず、pythonのインストールと開発環境（pycharmなど）のインストールをして自由にコードを書ける状態にする
次に
https://developer.twitter.com/en/portal/projects/1584329733894197248/apps/25823136/keys
自動化したいアカウントでこのサイトにログインし、
ツイッターのAPIなるものを取得しなければいけないらしい
APIとはアプリをプログラミングで動かすための仲介役というもの
つまりこれを取得しないとどうにもならない

APIとして必要なものは
API　Key
API Secret
アクセスtoken
アクセスtoken secret
の４つが必要
https://python-man.club/python_twitter_api/
取得方法はこちらのサイトでも詳しく説明している　３の部分は　申請して認証メールが来ないとツイート以外のことが行えないようなのだが、自分はなぜか一応申請はしたが認証メールが来る前にすべての機能（いいね、リツイート、フォローなど）が出来た
![スクリーンショット (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849641/95f6d200-6b20-507d-4fa8-f9d0ca72fb01.png)
この赤丸の「your project has elevated access」というマークがあれば良いらしい
![スクリーンショット (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849641/0b1fd2e9-6c5d-c4a2-276a-01c32ecbd879.png)
確認はサイトで自分のプロジェクト名を押して、この「view detailed features」をクリックすることで確認できる
### ツイートをしてみる
まずはpycharmから簡単なツイートをしてみる　pycharm、vscodeなどを開いたら、以下の認証コードを打ち込む

```py
import tweepy
import re


consumer_key = 'xxxxxxxxxxxxxxxxxxxxxxxx'
consumer_secret = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
access_token = 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'
access_token_secret = 'vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv'

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
```
まずツイッターを動かすための決まり文句的なコード。先ほど取得したアクセスキー４つはここにセットするために使う　import reは正規表現を使うため
そして
```py
api.update_status("おはようございます")
```
と、api.update_status()でツイートが出来る　実行ボタンを押したのち実際にツイッターで確認してみよう。普通に人間がツイートをした時と同じようにツイート出来ていたらＯＫ
このコードが正常に動き、ツイッターの画面を開かずともツイートが出来た時ほんとに感動した

### 実際に動かすコード
これ↓をさっきの認証コードのしたに書いていきます
```py
mensyon = []

search_results = api.search_tweets(q="プレゼント 抽選 min_retweets:1000 exclude:retweets", result_type="recent",count=20)
for result in search_results:
    tweet_id = result.id #Tweetのidを取得
    user_no_id= result.user._json['id']#ユーザーのidを取得
    
    if re.compile("@([A-Za-z0-9_]+)").search(result.full_text):#メンションを探す
        mensyon.append(re.findall('@([A-Za-z0-9_]+)', result.full_text))
    try:
        api.retweet(tweet_id) #リツイートする
        api.create_favorite(tweet_id)#いいねする
        api.create_friendship(user_id = user_no_id)#フォローする
    except Exception as e:
        print(e)
for i in mensyon:
    for s in i:
        api.create_friendship(screen_name=s)
```

- まずmensyonというリストを用意してメンションがあった場合そこにどんどん追加していく
- 次にapi.search_tweets()で目当てのツイートを探していく
  - 引数のq=""に検索ワードを半角スペース区切りで入力していく
  - 「min_retweets:数字」で最低リツイート数を指定してただのつぶやきのような感じのは拾わないようにする
  - またこのままではリツイートしたツイートを拾ってしまう　まったく関係ないリツイートをリツイートをしてその人をフォローしてしまうので、exclude:retweetsで除外する
  - そしてresult_type=""でどんなツイートを検索するか指定する
　"popular"で人気のツイートを　"recent"で最近のツイートを　"mixed"で２つが混在したツイートを探す

- そしてfor文で一つずつ取り出しtweetのid、そのツイートをしたユーザーのidを取得していく
- 次のif文で正規表現をつかい@に続く英数字とアンダースコアを抽出し、mensyonに追加していく
  - api.create_friendship()は引数に(ユーザーID)、または(screen_name="＠に続く英数字とアンダースコア")をとることでそのユーザーをフォロー出来る
- for文を抜けだしたところでmensyonリストのユーザーをフォローしていく

と、こんな感じのコードでとりあえずはいけそう   
そしてフォローとリツイートだけしていると垢BANされるそうなので違うファイルにランダムツイートするコードも書いておく
```py
import random
tweets = ["aaaaaaaaaa","bbbb","cccccccc","ddd","eeeee","fffff"]
api.update_status(random.choice(tweets))
```
先ほどのAPIの４つのキーを書く認証のコードを書き、下にこのようなコードを書くことでランダムで設定しておいたツイートがされる

そしてデスクトップに適当なフォルダを作成しておいて、応募するコードのファイルとランダムでツイートするコードのファイルを入れておいてください↓
名前はなんでもよいです
![スクリーンショット (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849641/a73cc509-3767-08c8-bc80-547f22dc46a1.png)

### 最後にタスクスケジューラで定期実行
凄く分かりやすいページがあったのでここに貼っておきます
https://mitchieblog.com/windows-taskscheduler-python/
↑なんか見れなくなってる　すみません以下のサイトなどを参考にしてみてください
https://otona-life.com/2022/06/09/121565/

これで自動で応募するBOTが完成しました
herokuというサービスを使えば、パソコンが完全にシャットダウンしていてもコードが実行されるようなのですが、準備段階でうまくいかず、一日格闘したのち断念しました

１０月３１日から本格的にBOTを稼働させてみます
当選し次第、またこちらの記事を更新したいと思います