初心者がAWS Lambda + Python + LINE BotでWikipediaのタイトルをランダム送信


本記事は「[いのべこ 夏休みアドベントカレンダー 2021](https://qiita.com/jugemsan/items/6c8b7324b9390a557774)」の13日目の記事です。記事の掲載内容は私自身の見解であり、所属する組織を代表するものではありません（お約束）。

# はじめに
入社から1年半が経ったが、研修修了後から全くプログラミングを触らなくなってしまった。
さすがに危機感を感じた私はここで行動に移さなければという使命感から今回このような記事を書くことにした。

## プロフィール
* 社会人2年目
* プログラミング経験ほぼなし（研修でやったことはほぼ忘れた）
* 経営学士
* サッカーやってました（幼稚園～大学）
* 最近とろろが好きになってきた

## 技術経験
入社からアプリ開発はほぼなく、データベースの構築やOSSの構築などの環境構築作業をメインで行っていた。そのためコーディングの経験や知識が不足しており、まじ半端ねーやべーレベルでできない。（型はstringとintしか知らないレベル）

# 作るもの
![iOS の画像 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1786591/c961f852-6969-987f-b461-454c9e314ed8.png)


それではようやく本題に入ろうと思う。
どこに需要があるんだよと思うかもしれないが、適当な言葉を入力するとランダムでWikipediaからタイトルとURLを持ってきて5個教えてくれるbotだ。まあ気になるタイトルあったら調べるんじゃねっていう軽い気持ちで作ったので需要とかは今回はなしでお願いしたい。

# 使用技術
* Python3系
* AWS Lambda
* LINE Messaging API
* WikipediaのAPI(?)

# 開発手順
## Wikipediaからランダムのタイトルを持ってくる
なんかわからんけどこのAPIでランダムなタイトル持ってこれるらしい。

http://ja.wikipedia.org/w/api.php?format=json&action=query&list=random&rnnamespace=0&rnlimit=10

ということでこれを使ってタイトル持ってくることにした。

```python
import requests

url = "http://ja.wikipedia.org/w/api.php?format=json&action=query&list=random&rnnamespace=0&rnlimit=10"

r = requests.get(url)

rval = r.json()

text = ""
n = 1

for jsn_val in rval["query"]["random"]:
    if n < 10:
        text += jsn_val["title"] + "\n"
    else :
        text += jsn_val["title"]
    n += 1


print(text)
```
上記を実行した結果が以下だ。

```shell
$ python main.py
大田紳一郎        
早太郎温泉        
山口将吉郎        
下大静脈
定
和田春生
半田市立乙川中学校
コミック・モエ    
口呼吸
吉村和之
```

ちなみにここに来るまでに2、3時間かかってしまった。
一つ一つの処理を理解するのに時間がかかってしまった、、、

## LINE Developersの登録
今回は以下のサイトを参考に登録を行った。

https://qiita.com/taku-0728/items/c80bcf65aba318ac6db0

特に難しいこともなかったし、登録するだけだった。

## Lambdaの関数を作成
ここに関しても上記のサイトと同じものを参考にし、まずはオウム返しをする仕組みを作ってみた。
![iOS の画像 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1786591/f6a505c6-ae97-74f0-07a6-aff0f4401ee2.png)

とりあえずそのまま貼り付けて完成。

この仕組みを活かして今回作りたいWikipediaからの情報を持ってくるように変更していく。

```python
import json
import urllib.request
import requests

def get_title():
    uri_tmp = "https://ja.wikipedia.org/wiki/"
    url = "http://ja.wikipedia.org/w/api.php?format=json&action=query&list=random&rnnamespace=0&rnlimit=5"

    r = requests.get(url)

    rval = r.json()

    msg_json_list = []
    
    for jsn_val in rval["query"]["random"]:
        uri = uri_tmp + jsn_val["title"]
        msg_json = {
            "type": "text",
            "text": jsn_val["title"] + '\n' + uri
            }
        msg_json_list.append(msg_json)
    
    print(msg_json_list)
    
    return msg_json_list

def lambda_handler(event, context):
    msg_title_json = get_title()
    for message_event in json.loads(event['body'])['events']:
        url = 'https://api.line.me/v2/bot/message/reply'
        headers = {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ' + "hogehoge"
        }
        body = {
            'replyToken': message_event['replyToken'],
            'messages': msg_title_json
        }

        req = urllib.request.Request(url, data=json.dumps(body).encode('utf-8'), method='POST', headers=headers)
        with urllib.request.urlopen(req) as res:
            logger.info(res.read().decode("utf-8"))


    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```

何とか完成！
LINEで適当な文字を送ったら、、、
![iOS の画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1786591/99e8bfec-60cd-0a5e-d861-a4810b5eb575.png)
返ってきた！
無事に完成しました！

# 感想
今回作ったLINE botは全く持って需要がないということが分かったとともに、プログラミングおもろくねという感情が沸き上がった。今回は会社でのイベントでこういったことを行ったが、プライベートでもやりたいということで、次回はスロット台作ってみたという投稿をする。お楽しみに！