質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.99%

  • Go

    421questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

  • スクレイピング

    213questions

  • LINE Messaging API

    97questions

golangでのlinebot上でスクレイピングした結果が返ってこない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 345

seven77

score 3

linebot-sdk-goとgoqueryを用いて、スクレイピングした結果を特定のワードの返答として返したいのですが、linebotで表示されません。
herokuで行っているのですが、リクエストは届いているみたいです。

以下はコードです。

for _, event := range events {
            if event.Type == linebot.EventTypeMessage {
                switch msg := event.Message.(type) {
                case *linebot.TextMessage:
                    if msg.Text == "test"{
                        bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage("success")).Do()
                    }else if msg.Text == "now" {
                        n := time.Now()
                        NowT := timeutil.Strftime(&n,"%Y年%m月%d日%H時%M分%S秒")
                        bot.ReplyMessage(event.ReplyToken,linebot.NewTextMessage(NowT)).Do()
                    }else if msg.Text == "disney"{
                        doc, err := goquery.NewDocument("http://disneyreal.asumirai.info/realtime/disneyland-wait-today.html")
                        if err != nil {
                            log.Fatal(err)
                        }
                        test := doc.Find(".wait-time #WL_BTMOUNTAIN .area .time p").Text()
                        _, err = bot.ReplyMessage(event.ReplyToken,linebot.NewTextMessage(test)).Do()
                        if err != nil {
                            log.Fatal(err)
                        }
                    }
                }
            }
        }

disneyに対する応答でのherokuのlogは以下のようになりました。

2017-12-27T13:09:37.740726+00:00 app[web.1]: 2017/12/27 13:09:37 linebot: APIError 400 The request body has 1 error(s)
2017-12-27T13:09:37.740741+00:00 app[web.1]: [messages[0].text] May not be empty
2017-12-27T13:09:43.499233+00:00 heroku[web.1]: State changed from starting to up
2017-12-27T13:09:37.745937+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=POST path="/callback" 
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • seven77

    2017/12/27 18:37

    bot.ReplyMessage(event.ReplyToken,linebot.NewTextMessage(test)).Do()でのエラーをログに出力の仕方がわからないのですが、教えていただけると助かります

    キャンセル

  • mattn

    2017/12/27 19:11

    https://github.com/line/line-bot-sdk-go/blob/c87b736869c5b513726a60407afa5c31d4a94aa4/linebot/send_message.go#L112 戻り値が2つ返るので _, err := bot.Reply.... の様に err を受けて if err != nil { log.Fatal(err) } などで出力すると良いかと思います。

    キャンセル

  • seven77

    2017/12/27 22:15

    ありがとうございます!err内容はでたのでかくにんしてみます

    キャンセル

回答 1

checkベストアンサー

+1

line-bot-sdk-go のテストコード を見る限りですが、送っている text が空文字列の様です。scraping が失敗しているのではないでしょうか。

ちなみに軽く HTML を見た感じ、selector は以下の間違いではないでしょうか?

test := doc.Find("#WL_BTMOUNTAIN .area p").Text()    

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/28 10:24

    回答ありがとうございます。
    指摘されたコードで直しましたが同様のエラーが発生しました。

    linebotのコードでない場合、以下の所はうまくいきました。
    ```
    doc, err := goquery.NewDocument("http://disneyreal.asumirai.info/realtime/disneyland-wait-today.html")
    if err != nil {
    log.Fatal(err)
    }
    test := doc.Find(".wait-time #WL_BTMOUNTAIN .area .time p").Text()
    ```

    キャンセル

  • 2017/12/28 12:30

    いえ、 .time は要りません。

    キャンセル

  • 2017/12/28 14:04

    .timeを抜いてやったところ、同様のエラーが発生してうまく行きませんでした。
    ```

    doc, err := goquery.NewDocument("http://disneyreal.asumirai.info/realtime/disneyland-wait-today.html")
    if err != nil {
    log.Fatal(err)
    }
    test := doc.Find(".wait-time #WL_BTMOUNTAIN .area .time p").Text()

    ```

    だけで他のgoファイルでやるとうまくいきます。

    ```
    for _, event := range events {
    if event.Type == linebot.EventTypeMessage {
    switch msg := event.Message.(type) {
    case *linebot.TextMessage:
    if msg.Text == "test" {
    bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage("success")).Do()
    } else if msg.Text == "now" {
    n := time.Now()
    NowT := timeutil.Strftime(&n, "%Y年%m月%d日%H時%M分%S秒")
    bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(NowT)).Do()
    } else if msg.Text == "disney" {
    doc, err := goquery.NewDocument("http://disneyreal.asumirai.info/realtime/disneyland-wait-today.html")
    if err != nil {
    log.Fatal(err)
    }
    test := doc.Find("#WL_BTMOUNTAIN .area p").Text()
    _, err = bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(test)).Do()
    if err != nil {
    log.Fatal(err)
    }
    }
    }
    }
    }
    ```
    上記だとうまくいきませんでした。

    キャンセル

  • 2017/12/28 14:07

    ```
    package main

    import (
    "fmt"

    "github.com/PuerkitoBio/goquery"
    )

    func main() {
    doc, err := goquery.NewDocument("http://disneyreal.asumirai.info/realtime/disneyland-wait-today.html")
    if err != nil {
    fmt.Println(err.Error())
    }

    wait := doc.Find(".wait-time #WL_BTMOUNTAIN .area .time p").Text()
    fmt.Println(wait)

    }
    ```

    だとうまくいきます

    キャンセル

  • 2017/12/28 14:22

    閉園後は .time ノードが無くなるようですね。

    キャンセル

  • 2017/12/28 15:01

    .timeノードをなくしてエラーを見ても同様で、空文字となってしまいます。

    ```
    ```
    package main

    import (
    "fmt"

    "github.com/PuerkitoBio/goquery"
    )

    func main() {
    doc, err := goquery.NewDocument("http://disneyreal.asumirai.info/realtime/disneyland-wait-today.html")
    if err != nil {
    fmt.Println(err.Error())
    }

    wait := doc.Find("#WL_BTMOUNTAIN .area p").Text()
    fmt.Println(wait)

    }
    ```
    実行すると、今だと以下のように返ってきます

    ```
    運営中発券終了100 分待ち
    ```

    キャンセル

  • 2017/12/28 15:01

    LINEbotのほうだとうまくいきませんでした。

    キャンセル

  • 2017/12/28 15:20

    ディズニーのページが heroku などのサーバを拒否している可能性はあります。bot のアクセスが多くて困っているサイトなどはそういう対応をする場合もあります。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Python スクレイピング

    前提・実現したいこと ど素人です。スクレイピングにてあるサイトからBeautifulsoupを使用して指定の箇所を抜き出したいと思っております。 指定サイト:http://ra

  • 解決済

    Python スクレイピング

    [実現したい事] Python/スクレイピング初心者です。毎日コツコツ勉強しています。 スクレイピングにてあるサイトからBeautifulsoupもしくは正規表現を使用して指定

  • 解決済

    [Ruby]webスクレイピング

    webスクレイピングで、<span>の中身をとりだしたいんですが、上手く実行されません。 HTML内で求めるspanが何番目にあるか数えたり、検索機能で調べたり、コード内の変数

  • 受付中

    phpのスクレイピングGoutte

    <li class="" data-owner-id="111">…</li> <li class="" data-owner-id="112">…</li> <li class=

  • 解決済

    golangでファイルに上書きではなく、追加書き込みをしたいです。

    環境 Go1.8.3 gogland EAP やりたいこと ファイルに[]byteで文字を何度か書き込みたいのですが、調べた方法で行うと、前回書き込んだ文字列が消えて新しい文字

  • 解決済

    heroku環境でエラー

    herokuでWe're sorry, but something went wrong.と出て、 heroku logs をするとこういうエラーが出た。 どうすれば直りますか?

  • 解決済

    Pythonスクレイピング

     前提・実現したいこと Yahoo画像検索を使用して画像を集めまくるプログラムを作成したいのです。※超初心者です。  発生している問題 bs4で画像のURLを取得する方法が解ら

  • 解決済

    RailsアプリのHerokuデプロイ時のエラーが直りません。

    どんなに調べてもHerokuへのデプロイを行うことができません。どなたかお力を貸して頂けると幸いです。  エラー (制限字数をオーバーしてしまうので一部省略してあります)

同じタグがついた質問を見る

  • Go

    421questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

  • スクレイピング

    213questions

  • LINE Messaging API

    97questions