PythonからTwitterと天気予報のAPIを使って自動ツイートをする

# 初めに
タイトルの通りPythonを使用して定期ツイートをするプログラムを作りました。
使用したライブラリはtweepy、使用した天気予報APIは[天気予報 API（livedoor 天気互換）](https://weather.tsukumijima.net/)です。
lolipopというレンタルサーバー上にアップロードして定期実行させています。

# 目次
1.Twitter APIの取得
2.tweepyのインストールとテスト
3.天気予報APIの取得とテスト
4.最後の仕上げ
5.サーバーにアップロード
6.サーバー側にtweepyをインストール
7.サーバー上で定期実行


# 1.Twitter APIの取得
これが一番大変でした。
[Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ](https://qiita.com/kngsym2018/items/2524d21455aac111cdee) を参考にして登録しました。
元々持っていたアカウントを使用しました。手順は以下の通りです。

1.電話番号認証をする
2.Twitter Developerにアクセスしてログイン
3.必要事項の入力
4.高レベルアクセス権の取得
5.権限の設定
6.キーの再発行

### 1-1.電話番号認証
そのままの意味です。電話番号認証をしないとAPIが使えません。
### 1-2.Twitter Developerのページにアクセス
https://developer.twitter.com/ にアクセスして右上のボタンからログイン。
### 1-3.必要事項の入力
名前、住んでいる国、APIの使用目的などを入力します。
利用規約に同意してsubmitボタンを押すとメールが届いて、メールのリンクを踏むと完了です。
### 1-4.高レベルアクセス権の取得
どうやらEssentialからElevatedというものにならないとツイートできないらしいので申請していきます。<br>
__1.ここをクリック__
![スクリーンショット (240)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2186646/615f1774-24a7-c715-d2e3-e63bd1eff968.jpeg)

__2.必要事項の入力__
ここで文章を書く必要が出てきます。
一応日本語でも通るらしいですが、英語推奨なのでDeepL翻訳やGoogle翻訳などを使うのをお勧めします。
私の書いた文章を載せておきます。(DeepL翻訳使用)

> I will use it to learn Python and API.
I'm planning to make a program that tweets the weather retrieved from the weather forecast API at a fixed time every day.
I do not intend to use it for spamming.

>PythonとAPIの勉強に使わせていただきます。
毎日決まった時間に天気予報APIから取得した天気をツイートするプログラムを作ろうと思っています。
スパムなどに使うつもりはありません。

続いて使う機能を選択します。ツイートするだけなら2個目以外はいらないはずです。私は政府機関云々のところ以外は入力しました。
以下、私の書いた文章です。
>Are you planning to analyze Twitter data?
Twitterのデータを分析する予定がありますか？

>I don't plan to use it now, but in the future I may output it to a text file using Python tweepy, etc. and use it for analysis.
It will not be used for the purpose of collecting personal information.

>今は使う予定はありませんが、将来的にはPythonのtweepyなどを使ってテキストファイルに出力し、解析に利用することもあるかもしれません。
個人情報収集の目的では使用しません。

>Will your app use Tweet, Retweet, Like, Follow, or Direct Message functionality?
>アプリでツイート、リツイート、いいね、フォロー、ダイレクトメッセージの機能を使用しますか？

>Yes, I plan to create a program that will tweet the weather forecast retrieved by the API at a regular time every day.
It will not be used for spamming purposes.

>はい、APIで取得した天気予報を毎日定時にツイートするプログラムを作成する予定です。
スパム目的では使用しません。

>Do you plan to display Tweets or aggregate data about Twitter content outside Twitter?
>Twitterのコンテンツに関するツイートや集計データをTwitterの外部で表示する予定はありますか？

>I don't plan to use it now, but I may introduce it in my graduation research or blog in the future.
If I do use it, I will process it so that no individual is identified before posting it.

>今は使う予定はありませんが、今後、卒業研究やブログで紹介することがあるかもしれません。
使用する場合は、個人が特定されないように加工してから掲載するつもりです。

入力が終わったら規約に同意してsubmitを押せば完了です。
私の場合は一瞬で承認されました。

### 1-5.権限の設定
このままではツイートする権限が無いので権限を与えます。
訳あってスクショによって時系列が違いますが問題ないので気にしないでください。<br>

__1.プロジェクトの設定を選択__
![スクリーンショット (245)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2186646/1559aaf4-8537-93be-05ae-7161812a9aa8.jpeg)


__2.Set upを選択__
![スクリーンショット (235)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2186646/0c5c593f-a8e9-cbfa-3efc-bfd5a8e18708.jpeg)

__3.OAuth 2.0、OAuth 1.0aにチェックを入れる__
多分権限の設定だけならOAuth 1.0aだけでも大丈夫だと思います。
![スクリーンショット (236)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2186646/58de02fd-eaf3-0f73-deb5-40afd6fa8512.jpeg)

__4.App permissionsの欄をRead and write and Direct messageに変更__
ツイートするだけならRead and writeでも構いません。
![スクリーンショット (244)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2186646/e9b7d6fb-fcf5-e769-9e24-b186e74c0535.jpeg)

__5.Callback URI / Redirect URL と Website URLを入力__
ここがよくわからなくて一番時間を使いました。
実際未だによく理解していないので有識者の方いらっしゃいましたらコメントしていただけると幸いです。
[それっぽい説明の載っているサイト](https://ja.stackoverflow.com/questions/49539/api%E3%81%AEredirect-url%E3%82%84-call-back-url%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6) (私は何となくしか理解できませんでした...)
私は両方とも自分のTwitterアカウントのURLを入れました。(危険だったら教えてもらえると幸いです)
![スクリーンショット (238)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2186646/38ea9b0c-e9eb-18a1-edaa-68b768255eaf.jpeg)

### 1-6.キーとトークンを再発行する
権限変えたら再発行が必要らしいので再発行します。
どこかにメモしておいてください。<br>
__以上でTwitter APIの設定は終わりです。__

# 2.tweepyのインストールとテスト
ターミナルで以下のコマンドを実行。

```
pip install tweepy
```
インストールできたら次のようなコードを書きます。

```python
import tweepy

TEXT = "ツイートしたいテキスト"

consumer_key = "取得したAPI key"
consumer_secret = "取得したAPI Key Secret"
access_token = "取得したAccess Token"
access_token_secret = "取得したAccess Token Secret"

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)
api.update_status(TEXT)
```
__実行してツイートできていたら完了です。__

# 3.天気予報APIの取得
[天気予報 API（livedoor 天気互換）](https://weather.tsukumijima.net/)というサイトを使いました。
特にキーなどは必要なく、URLにアクセスするだけでjson形式で返ってきます。<br>

次のようなコード書きます。クラス化していますが関数とかでも構いません。
リクエストURLの作成にformatを使用していますが、末尾に付け足すだけなので(URL + TOKYO)とかでも大丈夫です。<br>
地域一覧は[こちら](https://weather.tsukumijima.net/primary_area.xml)を参照してください。

```python
import requests

class Translation:
    def __init__(self) -> None:
        self.URL = "https://weather.tsukumijima.net/api/forecast/city/{}" # 基本URL
        self.TOKYO = "130010" # 地域のID ここでは東京
        self.URL_TOKYO = self.URL.format(self.TOKYO) # URLを作成

    def get(self):
        link = self.URL_TOKYO # URLセット
        request = requests.get(link) # リクエストを投げる
        result = request.json() # jsonに変換

        # タイトル (例:東京都 東京 の天気)
        title = result["title"]
        # 天気 (例:くもり　昼過ぎ　一時　雪") replaceで全角スペースを半角に変換
        weather = str(result["forecasts"][0]["detail"]["weather"]).replace("　"," ")
        # 最低気温 5時以降はnullが返ってくるので注意
        tempMin = result["forecasts"][0]["temperature"]["min"]["celsius"]
        # 最高気温
        tempMax = result["forecasts"][0]["temperature"]["max"]["celsius"]

        res = f"{title}\n{weather}\n最低気温は{tempMin}度 最高気温は{tempMax}度です"
        return res


if __name__ == "__main__":
    a = Translation()
    print(a.get())
```

実行すると以下のような内容が返ってくると思います。

```
東京都 東京 の天気
くもり 昼過ぎ 一時 雪
最低気温はNone度 最高気温は3度です
```

Noneが返ってくるのは仕様です。5時以降に叩くとNoneが返ってきます。
__正常に返ってきていたら完了です。__

# 4.最後の仕上げ
もう一息で完成です。
tweepyのテストで書いたコードに少し書き足します。
クラス化せずに関数で書いた場合は2行目と3行目を消してください。
キーはベタ打ちでも問題ないですが、クラス化しておくと後々別の目的で使いたくなったときに楽です。

```python
import tweepy
import 天気予報APIのファイル

translation = 天気予報APIのファイル.Translation()

TEXT = translation.get() # 関数にした場合は TEXT = 関数名()

consumer_key = "取得したAPI key"
consumer_secret = "取得したAPI Key Secret"
access_token = "取得したAccess Token"
access_token_secret = "取得したAccess Token Secret"

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)
api.update_status(TEXT)
```

__実行してみてツイートされていたら完成です！__

# 5.サーバーにアップロード
ここから先はlolipop限定の話になります。ご了承ください。
Windowsであればタスクスケジューラを使用して似たようなことができると思います。

__アップロードする前に実行ファイルの一行目に以下の一文を書き足してください。__

```python
#!/usr/local/bin/python3.7
```

私はFFFTPを使ってアップロードしました。
FFFTPの環境構築をしたのがかなり前で何も覚えていないので詳しくはググってください。

__アップロードしたらパーミッションを変更します。__
FFFTP側でも設定できますが、ここではlolipop側で設定します。

__1.サーバーの管理・設定 -> ロリポップ！FTP__
![スクリーンショット (246)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2186646/47df1222-1079-051c-2cc0-2800546c1685.jpeg)

__2.実行ファイルを選択 -> 現在の属性を700に変更__
777とかでも構いません。お好みでどうぞ。
![スクリーンショット (248)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2186646/36726cb3-b3db-fd3b-884f-cd7de16b27f6.jpeg)
__以上でパーミッションの設定は完了です。__

# 6.サーバー側にtweepyをインストール
__サーバーの管理・設定 -> SSH__ からSSHを有効にしたら、[こちらのサイト](https://creepfablic.site/2019/06/10/lolipop-pipcommand/)を参考にしてpipの導入をしてください。(丸投げですみません)

pipの導入が終わったら以下のコマンドを実行。

```
pip3 install tweepy
```
__以上です。__

# 7.サーバー上で定期実行
__1.サーバーの管理・設定 -> cron設定__
![スクリーンショット (250)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2186646/413702ff-ab44-6a2d-1075-e0c1c54a76c6.jpeg)
__2.cronの設定をする__
こんな感じで設定します。時間などはお好みで。5時以降だと最低気温がNoneになってしまうのでそれよりも前をお勧めします。
![スクリーンショット (251)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2186646/fe89de57-6676-f100-5c28-3f095f6f6ad3.jpeg)
__以上で全て完了です！__

# 終わりに
最後まで読んでいただきありがとうございます。
記事を書くのはこれが初めてなので至らない点が多いと思います。何か気になることや間違っていることがありましたらコメントしていただけると幸いです。