kta-basket's blog

バスケット好きによるなにか

JJが「女性版KD」と呼ばれモヤった件について考える

2022年2月に大阪にて今夏オーストラリアにて開催されるFIBA Women's Basketball World Cupの最終予選がありました。 出場国は日本、カナダ、ボスニアヘルツェゴヴィナベラルーシの4ヶ国でこのうち3ヶ国が出場権を得る、という大会です。

ベラルーシが選手にコロナ陽性者が出てしまい出場辞退したため、残りの3国は試合さえ実施できれば出場権が得られる状況で、日本は10日にカナダと、13日にボスニアヘルツェゴビナと対戦しました。

これらの試合はフジテレビNEXTとバスケットliveにて中継され、それぞれ実況解説がついていたわけですが、13日の試合をバスケットliveで実況していた松本さんがボスニアヘルツェゴビナのエース、ジョンクエル・ジョーンズ選手(以降JJ)のことを「女性版KD」と称しました。

このことに私および周囲の女子バスケファンがモヤっていたため、物事を整理してみたいと思います。

そもそもJJとKDって誰

JJ

昨年度WNBAMVP!だけでも十分すごい選手だと伝わるかと思いますが、バハマ生まれの28歳で、14歳で渡米し、渡邉雄太と同じジョージ・ワシントン大卒、WNBAユーロリーグでプレーしており、ユーロリーグでプレーするのに有利なためボスニアヘルツェゴビナ国籍を取得して2019年からボスニアヘルツェゴビナ代表にも加わっています。

198㎝と高身長ながら柔らかいシュートタッチを持ち、WNBAオールスターでは3Pコンテストで決勝にも残りました。リバウンドも非常に強く、3度のリーダーに輝いている上にシーズンの平均リバウンド記録も持っています。

KD

NBAファンで知らない人はいないでしょうが、ケビン・デュラント選手のことです。2014年にMVPを受賞し、2017年と2018年にはウォリアーズの一員としてNBA連覇してファイナルMVPも受賞しています。208cm(実際はもっと高いという噂も)の身長、225㎝のウイングスパンとSFとしては規格外の長さを持ち、なおかつシュートが非常に上手いため、NBA史上最高の得点能力の持ち主という声もあります。得点王には4度輝いています。

※私はOKCファンのため私情により彼への評価は下方修正されがちなことを念頭に置いておいてください

誰かを誰かに例えるという行為について

「〇〇界の〇〇」スポーツ界に限らずよく見られる行為ですね。「ポスト〇〇」も近いニュアンスかと思います。

例えることがプラスに働くケース

その選手を知らない人に対し、その人が知っている別の人物で説明する

これが本来の正しい「例え」の利用方法かと思います。

NBAファンでオリンピックで女子バスケに興味を持った人に対し、「三好南穂はWリーグのJJ・レディック」や「篠崎澪はCJ・マッカラム」(※個人の見解です)と紹介することによってその選手に興味を持ったり、実際に試合を観て「なるほどたしかに」やら「むしろ〇〇じゃない?」やら言う内にその選手を覚えるでしょう。とっかかりとして非常にリーズナブルで、楽しめるきっかけになります。

例えることがプラスとは言えないケース

大胆に言ってしまえば上記以外は例えるということがプラスに働くことはほぼないのではないでしょうか。

「ポスト〇〇」もそうですが、過去の素晴らしい選手に例えられるケースは散見されます。例えられた側の選手はもちろん偉大な選手と引き合いに出され嬉しい気持ちはあるでしょうが、例える行為と比較する行為は紙一重なので、嫌う人も少なくないでしょう。NBAでは素晴らしい選手が出るたびにマイケル・ジョーダンと比較されてきましたが、時代も環境も異なる中での比較など意味はありません。結局のところジョーダンは素晴らしい選手で、コービーも素晴らしい選手、といったように個人に着目して偉大さを称えれば良いわけです。

期待の若手に対して「未来の〇〇」といった表現もグレーです。本人が「〇〇選手みたいになりたいです!」と言っているならまだよいのかもしれませんが、勝手に周りが言うのはアウトかなと。

今回の「女性版KD」について

例えることがプラスに働いているか

誰にとっての例えか?

例えることがプラスに働くケースかを考えてみます。NBA選手のKDに例えているわけですから、NBAクラスタ向けと考えられます。東京オリンピックでMVPも受賞していますが、日本男子が予選で敗退した中決勝まで見てMVPまで認識している人はそう多くないのではと思います。 バスケットliveでの配信であるので、普段Bリーグを観ていてオリンピックで興味を持ち女子を観始めた、という視聴者層は一定数いると期待したいですが、KDがどの程度認知されているかは不明です。まあバスケが好きな層なので決勝まで見たと想定してもいいのかな。

例えることでJJへの興味が増すか?

試合前からWNBAのMVPでボスニア・ヘルツェゴヴィナのエースとして取り上げられており、試合を観ていても圧倒的な存在感を持つJJに対し、KDに例えることでさらに注目してみよう、とはならないのでは、というのが私の意見です。

例えとして適当か

個人的に気になったのはこちらの方です。

プレースタイル

そもそもプレースタイルがかなり違うのですよね。KDは身長は高いもののアウトサイドメインでスリーとドライブとミドルジャンパーで得点を量産するタイプ、JJはインサイドプレイヤーでありながらスリーポイントも得意とするタイプ、とまあシュートが上手い点は共通していますが、アウトサイド軸かインサイド軸かの時点で異なるわけです。JJはリバウンド王にも輝いていますし。 今回KDに例えたのは柔らかいシュートフォームが似ているからなのかなと思います。

ちなみに以前私はWNBA選手をNBA選手で例えた際にはジョエル・エンビードに例えました。

プレースタイル以外

同じバスケットボール選手として例えるならば、プレースタイルから似ているポイントを探して例えることができますが、別業界(サッカー選手など)で例える際は生い立ちやメンタリティで考えるのかなと思います。

生い立ちは先に書いたようにバハマ出身でありながらバスケットボール選手として生きていくために国籍を変えたJJと(母子家庭で苦労はあったでしょうが)アメリカ出身のKDではかなり異なるように思います。WNBAのシーズンが男子同等の試合数でサラリーがもっと高ければユーロリーグに行く必要もなく国籍も変えなかったかもしれません。

メンタリティは信じられない移籍やらTwitter裏垢問題やらよろしくない話題の枚挙に暇がないKDとWNBAのスターとして女性の地位向上へ意見を発信するJJを比較するなんて許せません。※大いに私情を含んでいます

そもそも生い立ちやメンタリティはかなり詳しい人でないと知り得ないので、誰もが人生や人柄を知っている超有名人以外では使いにくい気がします。

つまるところ

今回の例えはあまり適当とは思えません。「シュートフォームが似ていますね」くらいなら良いし知っている人にとっては「確かに似ているかも?」と面白く感じられるかと思いますが、それだけで「女性版KD」と言うのはオーバーだし、シュートを打つ度に「KDですね~」と言うのはJJに失礼です。

”女性版”という表現について

ここまで敢えて言及していませんでしたが、今回の例え方で最も相応しくなかったのは”女性版”と称した点です。誰かに例える行為そのものもセンシティブですが、ジェンダー平等の観点で見ても非常に危ういものです。ジェンダー平等について考える際には”男女を入れ替えても違和感がないか?”です。「男性版〇〇」という表現を耳にしたことがありますか?いま「男性版」を検索したら検索結果の1ページ目は全て「男性版産休」の話、「女性版」を検索すると複数の話題が入り混じることからも「女性版」の方が使用頻度が高いとわかります。これは基本が男性であり、女性が副次的なポジションに置かれるケースが多いとも言えます。産休は女性が基本であるために「男性版」と言われるわけです。

アメリカでは昨今女子スポーツの地位向上へのアクションが増えており、NBAドラフトのCMがずっと女性スポーツに関するものだったり、WNBA開幕日にNBA選手がWNBAのフーディを着てアピールしたりしています。もちろんリーグ規模や認知度がNBAの方が桁違いに高いのは承知していますが、WNBA選手をNBA選手に例える際に「女性版」という表現を使うのはこうした両リーグの努力も無下にしている気がします。

ちょうどロシア問題でアメリカ代表として東京オリンピックで日本を圧倒したWNBAのスター、ブリトニー・グライナーが麻薬保持疑惑でロシアに拘留されている件について「彼女がNBA選手だったらホワイトハウスが既に声明を出している。」というツイートを見かけ、考えさせられました。水面下で何かしらは動いているのでしょうが、良い報告を耳にしたいものです。

最後に

松本さんは以前から何度も女子バスケを実況しており、選手のこともバスケの戦術についてもよくご存じで素晴らしいなと思う反面、専門用語が多くやや内輪ノリになりすぎる点は気になっていました。初心者も経験者もどちらも観ている中での実況は難しいとは思いますが、今回はこの懸念の方が強く出たケースとなりました。また、女子スポーツを担当される上でジェンダー平等については配慮が欲しいと思います。

2021 WNBA Finals GAME2

Game1に続き、Game2も考察してみます。

Full Gameはこちら

youtu.be

3戦先勝した方が優勝のファイナルでシカゴが先に1勝を手にし、ホームで負けられないフェニックス。1Qはグライナー!グライナー!グライナー!といった形で最初の10ポイントを一人で得点する活躍でチームを引っ張ります。対するシカゴはGame1に続きボールを回して良いショットチャンスが巡ってきた選手が着実に決め、26-20とシカゴリードで1Qを終えます。その後も流れが行ったり来たりしながら試合は進み、4Q終盤フェニックス1点リードでファールゲームを実行したシカゴに対しペディは1本しか決めることができず、その後のオフェンスでスルートが同点となるレイアップを沈めオーバータイムにもつれ込みます。オーバータイムでは残り1分半同点からトーラシの3Pで抜け出たフェニックスが守り切り、最後にスカイラーがダメ押しのレイアップを沈め、91-86とシリーズをタイに戻しました。

シカゴのオンボールスクリーンDFに対するフェニックスの対処

シカゴのDFプランはGame1から大きく変わっていません。オンボールスクリーンのハンドラーに対してダブルチーム気味のハードショウをするスタイル。Game1で相当苦しんだフェニックスですが、当然準備をしてきました。Game1の後半と同様オフボールスクリーンを増やしていましたが、大きく変わったのが、メインのハンドラーをスカイラーにしたことです。前回の考察にてこのDFのかわし方のひとつとしてあげたハンドラーがドリブルをついたまま大きく動く、ということを徹底して実施していました。スクリーナーのDFが出てくることがわかっているので、スクリーンを使ったあと斜め後ろの方向へ大きく下がり、スクリーナーのDFが簡単にプレッシャーをかけられないようにしていました。言うは易しですが、スカイラーのスピードによってその幅がかなり大きくなったことでトラップに引っかからず、かつシカゴDFに迷いを生じさせることに成功していたように思います。スクリーナーのDF(ビッグマン)がそのままスカイラーを追いかけるべきか、マッチアップを戻すべきかの判断が難しくなり、前回完璧に近かったシカゴのローテーションに狂いが生じます。その結果グライナーに簡単にポストアップを許したり、ヘルプのあとのローテーションが遅れたところにターナーが飛び込んだり、Game1では少なかったイージーシュートが増え、フェニックス本来の得点力を発揮することができました。また、スカイラーはハードショウで出てきたスクリーナーのDFとスクリーナーの間を割るスプリットという動きも見せていました。

ハイピックを減らし、スカイラーのアイソレーションを起点にしたり、オフボールでトーラシがグライナーにスクリーンをかけたり、シカゴのトラップを避けつつスイッチの判断を難しくさせる欠片がちりばめられていたように思います。

ソフィー・カニングハムの復帰

ふくらはぎの張りのため3試合欠場していたソフィー・カニングハムがこの試合から復帰しました。ベンチから出てきて流れを変えるシューターです。プレイオフ1回戦でもベンチから出てきて1試合7本のスリーを決めて勝利に大貢献しました。Game1でシェイ・ペディがスタートで調子が良かったので、スタメンは変えずカニングハムはベンチから出てくるかと予想していましたが、スタートはカニングハムでした。

結果、これが大成功。

連続で決めたスリーも印象的ですが、なによりカッパーに対するハードなDFが素晴らしかった。どこか殿様相撲というか、斜に構えたところのあるフェニックス(もといトーラシ)においてエナジー全開で吠えまくりながらプレーする彼女はチームにかなりの勢いを与えたように思います。彼女に感化されたかのようにGame1では少し大人しかったスカイラーもDFで気を吐き、シカゴのOFを停滞させる時間帯を作りました。

スタッツを確認したら得点自体は3P3本の9点のみ、スティールも1本のみですが、チームに与えたエネルギーは計り知れないように感じます。

クラッチタイム・トーラシ

本来のOFを取り戻したフェニックスにおいて、前半2点と振るわなかったGOAT ダイアナ・トーラシ。しかしもちろんそのままでは終わりません。3Qで4点を上げると、4Qで2本の3Pを沈め、オーバータイムでは4点プレーに始まりDF3秒で得たFT1本とさらに3Pの8得点を上げ、終わってみれば20得点。OT残り35秒で追いかけるシカゴのバンダースルートから値千金のスティールまで奪っています。接戦の終盤で彼女がいる恐ろしさを改めて思い知らされました。

余談ですが、この試合、サンズとのプレシーズンゲームのためにフェニックスにいたデイムタイム(クラッチタイムに強いことから)の異名を持つデイミアン・リラードが観に来ていましたね。淡々と試合を観ている様子でしたが、以前トーラシのTシャツを着ていたこともあったので、トーラシファンなのではと思っています。トーラシの4点プレイの際の彼のリアクションを確認したいところ。

フェニックスのDF

ソフィー・カニングハムがインテンシティをもたらした、と書きましたが、Game1との差分としてスイッチを安易にしなくなったように思います。(トーラシがファイトオーバーする気が全くなくスイッチしてミスマッチであっさり得点を許したシーンもありましたが。)基本的にハンドラーへのプレッシャーを上げてきていましたね。その結果がスルートの6TOとカッパーの4TOに繋がったかと思います。起点を苦しめた結果、4Q終了時点でシカゴ79点とGame1より12点も低く抑えることができました。また、トランジションの戻りも相当速くなっていたと思います。OFの際にターナーをトップ付近に置く機会が多く(元からか今回の作戦かは過去試合を見直してみなければ不明)、セーフティとしてAll-Deffencive First Teamにも選ばれている彼女が良く戻っていたため、シカゴにファストブレイクポイントを許さなかったシーンがいくつかありました。

結果的にシカゴは4人が二桁得点と一見バランスしていますが、合わせで活きるタイプのスティーブンスが9点とチームOFが脅威のシカゴとしては個での得点に頼らざるを得なかった印象です。(個で得点できるメンバーが4人もいるのは置いておいて)

Game3に向けて

さて、OFで本来の姿を取り戻し、DFでもインテンシティを上げることに成功したフェニックスですが、全く安心はできません。何せ、それでもオーバータイムにもつれ込む接戦だったのです。前回0ターンオーバーだったバンダースルートから6つのターンオーバーを引き出しましたが、再びこれを期待するのは確率の低い賭けかと思います。ただ、グライナーの止め方を再び模索しなければならなくなったシカゴも安泰ではありません。Game3ではまたDFプランを変えてくるのか、それとも方針はそのままに精度をまた上げてくるのか、眠れぬ日々を過ごすコーチ陣がどのような解を出してくるでしょうか。個人でいえば元気を取り戻しゲームウィナーを決めたスカイラーもFG%は散々だったのでもっと得点を伸ばせるのか、Game1に続き3P%が振るわないクイッグリーはホームでタッチを取り戻すのかも気になります。妄想を巡らせながら楽しみに土曜日を待ちたいと思います。

※現地実況解説でトーラジ勢よりトーラシ勢が多い気がしてきたのでトーラシ表記にしました。

2021 WNBA Finals GAME1

Game1のシカゴが素晴らしかったので勝因考察します。

Full Gameはこちら

youtu.be

1Qでさっそくトーラジがタフスリーを決め、この試合も理不尽モードか…⁉と戦々恐々なトーラジ&シカゴファンの私。 トーラジはこのあともスリーを沈め、これは調子良いモードですわ、と確信。 やや固さがみられるシカゴに対し、フェニックスが順調に得点を重ねリードするも、シカゴも1Q終盤に本来のプレーを取り戻し20-25と点差を詰めて終わる。 2Qに一気に畳みかけたシカゴは途中17-0のランを含む26-10で5点ビハインドから11点リードにして前半を終え、後半もじわじわ点差を広げ、4Q4:19で19点差のところでフェニックスも追跡を諦め91-77で試合終了。

スクリーンに対するシカゴDFの対処

シカゴはオンボールスクリーンに対してダブルチーム気味のハードショウのあとマッチアップを戻すDFをしていました。 これをやるとスクリーナーのDFがいなくなるのですが、パーカー&スティーブンスのプレッシャーが素晴らしいのでボールマンがパスを出せません。もう一人のインサイドDFがスクリーナーのヘルプをし、スクリーナーのDFをしていた選手とインサイドどうしでマッチアップを交換する場面もありました。 もう一つのこのDFのかわし方として、ボールマンがドリブルをついたまま大きく動くことでスイッチさせてミスマッチを作るという方法もあるのですが、こちらもドライブを止められてなかなかうまくいかず、成功したとしても後方のローテーションでなるべくミスマッチを作らないマッチアップにする判断が素晴らしく、良い結果に繋がりません。 フェニックスはハイピックを多用していましたがボールマンへのプレッシャーが成功し、スリーも打たせずパスも出させないどころかターンオーバー続出、パスが通ったとしてもそこまで有利なギャップは作れない、という状況。

ちなみにシカゴはアウトサイドプレイヤーどうしのスクリーンに関しては基本スイッチしていました。 インサイドとアウトサイドでスイッチが起こらないようにしていたのと、もしスイッチした場合のスイッチバックのタイミングも素晴らしかった。

後半フェニックスはハンドラーをシェイ・ペディにしてオフボールスクリーンからトーラジに渡したり、グライナーが初めからローポストにポジションを取るなどやや打開策を見出しましたが、終始オンボールスクリーンには苦しんでいました。

グライナーの止め方

さて、フェニックスと対戦するチームが頭を抱えるグライナーどう止める問題。 これに関してはひたすらに良いポジションでもらわせないことを徹底していました。 スティーブンス&パーカー&ドーソンが身体を張って外に押し出す、またはフロントに立ち、ペイントの少し外で持たれたらすぐダブルチームを送るのではなく、ドリブルをついた瞬間にアウトサイドプレイヤーがちょっかいを出しにいってドリブルを止めさせる、といったことをしていました。ポストアップに対してトーラジやスカイラー以外にマッチアップしているアウトサイドディフェンダーがスティールを狙っているよ、という寄りも見せています。

後半はゴールに比較的近い位置でボールを持たせるフェニックスの対策がうまくいき得点するシーンもありましたが、逆にポジション取り争いで2つのオフェンスチャージングを取られるなど、グライナーとしては厳しい試合でした。 最終的に今季のアベレージに近い20点取られていますが、FG 7/15、FT 6/6 とファールを抑えつつFG%も低く、よく守った方ではないでしょうか。(今季57.5%なので)

なお、この試合シカゴのインサイドではドゥー・フォールは試合が決まった終盤にしか出場していません。 彼女は長いですが、グライナーを押し出す重さ的に不利だから?

ちなみにセミファイナルではラスベガスはリズ・キャンベージは一人で守り、他のプレイヤーがマッチアップの場合はボールを持った瞬間ダブルチームを送る戦略を取っていましたね。 グライナーがゴールに近い位置であればダブルチーム相手にも得点したり、自分に二人きたことで空いた選手に捌いたりと止めきれなかった印象です。

トーラジ、スカイラーへのDF

トーラジに関してはスクリーンに対するDFで書いたダブルチームがより強固で、プレーオフキャリアハイの6つのターンオーバーを引き出しました。 また、ファールをもらいに体を当ててこようとする動きに対し見事な(笑)エビぞりで避けるシーンも見られました。FTA5本はかなり少ないのでは?

スカイラーに関してはあまり特別なDFはしていませんでした。基本的に一人で守り、ゴール近くのショットに対してのみヘルプDFもコンテストする程度。 前半は彼女がボールを持つ機会も少なかったように思います。後半に彼女らしいドライブも出たものの、試合を通して存在感が薄めでした。

シカゴのOF

試合前にゲスト解説のスー・バードがフェニックスはシカゴの速いペースにしないこと、シカゴはスリーポイントを36%以上で決めることをそれぞれ鍵にあげていました。 結果としてシカゴの3P%は34.8%と36%には届きませんでしたが、フェニックスから18個のTOを引き出し、タフショットが落ちたリバウンドからの速攻など、91点をあげる速いペースで勝利しました。

フェニックスはスクリーンに対して基本スイッチしていたので、一番有利なマッチアップで勝負させる、ヘルプがきたらフリーの選手にパス、とシンプルに攻めていました。 シンプルですが、その遂行能力が素晴らしいんですよね。そもそもパーカーとカッパーは1on1で守るのは難しい選手ですし、クイッグリーは少しでも隙間があればシュートを沈めますし、スルートはズレを作り出し一瞬の隙を見逃さないですし、スティーブンスはスリーも打ててインサイドへの合わせも上手い。スルート、パーカー、クイッグリーはパスも一級。ドーソンのスリーも効果的でした。

シカゴのインサイド陣はミスマッチでない限りあまりポストアップせず、スリーの外側で待つ(そしてスリーが入る)ので、中のスペースを有効に使えていましたね。 グライナーも外に出ざるを得ない。後半OFを改善してきたフェニックスですが、結局シカゴのOFを止める術がなく、万事休すといったところです。

カッパー21点、クイッグリー18点、パーカー16点、ドーソン14点、スルート12点、スティーブンス10点と6人が二桁得点。

フェニックスもDFの強度は強かったのですが、イライラして集中力を欠いた隙やベンチメンバーが狙われてしまいました。キア・ナースがいればまた違ったかなと思います。 あとはこの試合、リバウンドで34-29とフェニックスを5本上回ったのも大きいです。ターンオーバーはシカゴも15と多いですが、合わせて8ポゼッション多くOFの機会を得ました。

ちなみにスルートは12得点11アシスト5リバウンド1スティールの活躍かつターンオーバーが0という驚異的なスタッツでした。※ファイナルでの10アシスト以上0ターンオーバーは史上初

Game2に向けて

フェニックスはOFの組み立てをどう変えてくるでしょうか。後半にはやや打開策を見出しましたが、ベンチから出てきたボウンとハートリーが2/7、1/8では厳しい(シカゴは明らかにこの二人のDFをヘルプに回していましたね)です。ソフィー・カニングハムが復帰すればシュート力はやや頼もしくなりますが、スカイラーやグライナーのペイント内ポイントを増やしたいところ。DFはどうすればいいんでしょうね。。。

シカゴはDFの戦略が大成功したわけですが、継続しつつフェニックスの修正をどのように想定して準備してくるのか。パーカー&ドーソンのシュートタッチが続けばOFはなかなか止められないでしょう。逆に18点取っているもののクイッグリーは3Pがやや不調(3/11)だったので、もう少し決めていきたい。

プレーオフのシングルエリミネイション以外のシリーズの醍醐味はこのお互いの対応合戦だと思うので、Game2も非常に楽しみです。

WNBA選手をNBA選手にたとえてみた②

前回

ポジション・サイズ・プレースタイル・シュートレンジ・身体能力・メンタリティ、、、どこに着目するかで悩ましいところですが、基本的に同ポジションの選手からプレースタイルとシュートレンジ等を加味して選びました。 また、NBA選手は20-21シーズン現役の選手縛りにしています。

第2弾は母国が不出場などでオリンピックにはいなかったオールスター選手をpickup.

WNBA選手のカタカナ表記は公式が不明のため異なる場合があります

ジョンクエル・ジョーンズ as ジョエル・エンビート

Jonquel Jones
ジョンクエル・ジョーンズ
Joel Embiid
ジョエル・エンビート
Connecticut Sun
コネチカット・サン
Philadelphia 76ers
フィラデルフィア・セブンティシクサーズ
PF/C C/PF
198cm 213cm

恵まれた長い腕を活かしたゴール下での圧倒的な支配力を持ち、かつスリーポイントラインの外側でボールを受けてプレーすることを好むJJはたとえるならばジョエル・エンビード。この身長からクイックかつ高確率で決めてくるスリーポイントは脅威です。

今年のオールスターではスリーポイントコンテストに出場し、予選トップタイで決勝へ進出しました。

2016年にドラフトされ翌年にはリバウンドリーダーを獲得(その後2019,2021年も獲得)、2019年はスターティングセンターとしてチームを14年ぶりのファイナルに導き、2020年はコロナの影響でプレーしていませんが、2021年はエースのアリッサ・トーマス不在を埋める活躍でチームはレギュラーシーズン1位でプレーオフ進出を決めています。ボスニア・ヘルツェゴビナ代表としても活躍しています。

キャンデース・パーカー as 二コラ・ヨキッチ

Candace Parker
キャンデース・パーカー
Nikola Jokić
ニコラ・ヨキッチ
Chicago Sky
シカゴ・スカイ
Denver Nuggets
デンバー・ナゲッツ
C/PF C
193cm 211cm

アンソニーデイビスとも迷いましたが、自らボールプッシュし、パスも巧みでガードのような動きをすることからヨキッチとしました。WNBAのCP3ことキャンデース・パーカー、現在35歳とベテランですが、スクリーンやポストアップやカッティングといったセンターとしての基本的な動きはもちろん、スリーポイントも打てる広いシュートレンジとドライブからのパスなども得意で現代的なインサイドプレイヤーです。

2008年にドラフトされ、史上初の新人王とシーズンMVPを同時受賞。翌年には出産し、2か月後から復帰してAll WNBA 2nd Teamに選出されるなど規格外の選手です。2016年には優勝しファイナルMVPも獲得しています。昨年もMVP候補に入るなどまだまだ衰えを知らず、今年は地元シカゴに移籍してプレーオフではどんな活躍を見せてくれるのか、非常に楽しみです。

デワナ・ボナー as ケビン・デュラント

DeWanna Bonner
デワナ・ボナー
Kevin Durant
ケビン・デュラント
Connecticut Sun
コネチカット・サン
Brooklyn Nets
ブルックリン・ネッツ
SG/SF SF/PF
193cm 208cm

はい、ケビン・デュラントです。彼女をNBA選手でたとえるなら?と質問したらおそらく99.9%がKDと答えるのではないでしょうか。3番でインサイドに迫る身長と長い手足を持ち、線の細さ、広いシュートレンジと高い確率、どう考えてもKDです。

2019年まで在籍したフェニックス・マーキュリーでトーラジらとともに2度の優勝経験があります。2017年に双子を出産し、翌年には怪我人に苦しむチームを得点王争いをする活躍で引っ張りました。昨年からコネチカットへ移籍し、今年はJJに次ぐ得点を挙げています。

コートニー・ヴァンダースルート as リッキー・ルビオ

Courtney Vandersloot
コートニー・ヴァンダースルート
Ricky Rubio
リッキー・ルビオ
Chicago Sky
シカゴ・スカイ
Cleveland Cavaliers
クリーブランド・キャバリアーズ
PG PG
173cm 191cm

2014年と2017年から5年連続でアシストリーダーを獲得しているWNBAが誇るアシスト王のスルートは、パスセンスおよび自分のシュートより味方を活かす、流行りの得点力のあるガードとは一線を画すThe ポイントガードということでルビオを選びました。しかしシュートも決して下手ではないのですよね。

チームはプレーオフに進出するものの勝ち上がれない年が続いていますが、個人としては2018年に市場7人目となるトリプルダブルの達成、2020年に史上初のシーズン平均二桁アシストを達成するなど、実績は申し分ありません。 アメリカで生まれ育っていますが、ハンガリーにルーツがあり、国際大会にはハンガリー代表として出場しています。

プライベートではこのあと紹介するチームメイトのクイッグリーと結婚し、オールスターなどでお互いの活躍を喜び合う微笑ましい姿を見せています。

アリー・クイッグリー as ステフィン・カリー

Allie Quigley
アリー・クイッグリー
Stephen Curry
ステフィン・カリー
Chicago Sky
シカゴ・スカイ
Golden State Warriors
ゴールデンステイト・ウォリアーズ
PG/SG PG
178cm 191cm

クイックかつ高確率なスリーポイント、ドライブへの切り替えやその後のフローターやパススキルも抜群と、まさにステフィン・カリーです。JJの紹介で貼った今年の3Pコンテストでも3度目の優勝を飾っています。

特に2018年の3Pコンテスト決勝は圧巻です。

25本中20本決めています。。。

今年は怪我もありスタメンを若手に譲っていましたが、ベンチから出てきて二桁得点を稼いでいくのでシーズン終盤にはスタメンに帰ってきていました。プレーオフでも彼女のシュートが炸裂するでしょうか。 彼女もアメリカ生まれですがハンガリーにルーツがあり、ハンガリー代表として国際大会に出場していました。

youtu.be


お気づきになりましたか? オールスターから5選手と言いつつ所属チームは2チームです。 私の推しはシカゴです。

WNBA選手をNBA選手でたとえてみた①

先日、このような記事をシェアいただいて私もやってみたくなったので、トライしてみます。

NBAでいうとだれ!?WNBA選手をNBA選手でたとえてみた」 i-love-this-game.hatenablog.com

ポジション・サイズ・プレースタイル・シュートレンジ・身体能力・メンタリティ、、、どこに着目するかで悩ましいところですが、基本的に同ポジションの選手からプレースタイルとシュートレンジ等を加味して選びました。 また、NBA選手は20-21シーズン現役の選手縛りにしています。

第1弾ということで、先日のオリンピックUSA代表から主力6人をpickup.

WNBA選手のカタカナ表記は公式が不明のため異なる場合があります

スー・バード as クリス・ポール

Sue Bird
スー・バード
Chris Paul
クリス・ポール
Seattle Storm
シアトル・ストーム
Phoenix Suns
フェニックス・サンズ
PG PG
175cm 183cm

自身も高いシュート力を持ちながら、フロアを動かし味方を活かすポイントガード。例えるならば、NBAでポイントゴッドと呼ばれるクリス・ポールでしょう。

WNBAの現役最年長(40歳)であり、最多出場試合数や最多アシスト数など様々な記録を持ち、4度のWNBA優勝経験、5つのオリンピック金メダル、5度のユーロリーグ優勝という輝かしい栄光も持つレジェンド。 今なおUSA代表でも今季1位を突っ走る所属チームでもスタメンと衰えを全く見せていません。

プライベートではサッカーアメリカ代表のミーガン・ラピノー選手と婚約を発表しており、東京オリンピックに一緒に出場し、金メダル獲得を祝福した写真があちこちに上がっています。

ダイアナ・トーラシ as デイミアン・リラード

Diana Taurasi
ダイアナ・トーラシ
Damian Lillard
デイミアン・リラード
Phoenix Mercury
フェニックス・マーキュリー
Portland Trail Blazers
ポートランド・トレイルブレイザーズ
PG/SG PG
183cm 188cm

ラインのかなり後ろから簡単に沈めてくるスリーポイントクラッチタイムで殊更確率を上げてくる恐ろしさはまさにデイミアン・リラード。SGメインですがパスも非常に上手くPGとしても優秀です。ガードとしてはサイズもあるため、DFでは長い腕を活かしたスティールやブロックも光ります。

リラードはプレーオフ中にトーラシのGOAT(GreatOfAllTimeの意。頭文字からヤギの絵で表現されることもある)Tシャツを着ていたりしました。どちらかと言えばリラードをトーラシに例える方が適切かもしれません。

歴代最多得点、3度のWNBA優勝、5つのオリンピック金メダル、6度のユーロリーグ優勝などの経験を持つスー・バードと並ぶWNBAのレジェンド。二人は同じ大学でプレーしていました(スーが2学年上)。 最近は怪我が増えて欠場も多いものの試合に出れば恐ろしさは健在です。

プライベートでは元チームメイトのペニー・テイラーと結婚しており、息子が一人います。

ブリアナ・スチュワート as ヤニス・アデトクンボ

Breanna Stewart
ブリアナ・スチュワート
Giannis Antetokounmpo
ヤニス・アデトクンボ
Seattle Storm
シアトル・ストーム
Milwaukee Bucks
ミルウォーキー・バックス
SF/PF SF/PF
193cm 211cm

ドライブを得意としながらサイズを活かしてインサイドで圧倒的な強さを持ち、現役で最も止め方がわからない様はヤニス・アデトクンボ。スリーポイントも非常に得意としており、キャッチ&シューターとしても活躍します。

まだ26歳でありながらWNBA2度の優勝(どちらもファイナルMVP)、2つのオリンピック金メダル(東京オリンピックMVP)、ユーロリーグ優勝など数えきれないほどのリングを持っています。

プライベートでは元WNBAプレイヤーのマルタ・シャルガイと結婚し、娘が生まれたばかりです。

エイジャ・ウィルソン as バム・アデバヨ

A'ja Wilson
エイジャ・ウィルソン
Bam Adebayo
バム・アデバヨ
Las Vegas Aces
ラスベガス・エイシズ
Miami Heat
マイアミ・ヒート
PF PF/C
193cm 206cm

インサイドプレイヤーとしてはアンダーサイズながらやわらかいシュートタッチと高い打点で得点を重ね、リバウンドやDFで献身的に貢献する様はバム・アデバヨ。ミドルレンジを得意としながらスリーポイントは打たず、20シーズンにファイナルに行きながら優勝はできなかった点も共通しています。

20シーズンMVPを受賞し代表初選出の東京オリンピックでもスタメンで活躍し金メダル獲得に大いに貢献、今後もまだまだ活躍が期待される25歳です。

ブリトニー・グライナー as スティーブン・アダムス

Brittney Griner
ブリトニー・グライナー
Steven Adams
ティーブン・アダムス
Phoenix Mercury
フェニックス・マーキュリー
Memphis Grizzlies
メンフィス・グリズリーズ
C C
206cm 211cm

現役縛りをつけたばかりにめちゃめちゃ悩みました。ゴールを背にボールを受けるタイプのセンターが希少になってきているNBAにおいて、サイズを活かしてポストでボールを受け、高確率なフックシュートとDFが寄ってきた場合に回りにさばくタイプということでスティーブン・アダムスにしました。

現役縛りがなかったら現在スペインリーグにいるパウ・ガソル。ガソルと同じくポストやカッティングでボールを受けた後ボールを下げることなくシュートまでもっていく基本がちゃんとしているところが大好きです。

サイズにばかり注目されがちですが、シュートも非常に上手く(FT%も毎年8割程度)、機動力もあるセンターでWNBA得点王も2度獲得しています。1度のWNBA優勝、2つのオリンピック金メダル、2度のユーロリーグ優勝も経験。

ジュール・ロイド as ブラッドリー・ビール

Jewell Loyd
ジュール・ロイド
Bradley Beal
ブラッドリー・ビール
Seattle Storm
シアトル・ストーム
Washington Wizards
ワシントン・ウィザーズ
PG/SG SG
178cm 191cm

高いシュート力、巧みなハンドリングから伸びやかなステップのドライブ、アンセルフィッシュなプレイはまさにブラッドリー・ビール。トランジションの先頭を走ることも多く、オールコートでもハーフコートでも輝けるプレイヤーです。

スーやブリアナと同じチームのため、ファーストオプションではない時間帯も多いですが、攻めるべき時にきっちり点を取ってくるタイプで、よくセカンドユニットでのスコアラーを任されています。

日本語表記はジュール・ロイドが一般的ですが、「ジョー(ル)・ロイ(ド)」のように聞こえます。


他にもやりたい選手がたくさんいるので、第2弾もそのうち書きます。たぶん。

Pythonでスクレイピング ~Wリーグ版LINE Botを作った~

まえがき

Bリーグ版選手情報Botを作ったらWリーグ好きの後輩からリクエストをもらった。

Bリーグ版はTwitterで拡散して頂き現在友達989人!ありがとうございます。1000人いかないかな〜

Wリーグ版LINE Bot

後輩が丁寧に宣伝してくれました


この宣伝の結果Wリーグ版の方が友達が多くなり、Bリーグ版を真面目に宣伝するに至りました笑。
結果Bリーグが数倍になってしまったので、よかったらこちらをご登録の上、Wリーグを観に行ってください!

今シーズンは終わってしまいましたが、チーム間の実力差が埋まってきて面白くなってきています。

身体能力は男子に劣るものの、テンポの速さだったりシュートの正確さは男子以上です。(世界ランク10位は伊達じゃない)


友だち追加

実装

Bリーグ版とやることは変わらないので、まるっと載せます。


import re
import requests
from bs4 import BeautifulSoup
import gspread
from oauth2client.service_account import ServiceAccountCredentials

# wリーグ公式HP
BASE_URL = "https://www.wjbl.org"

def list_team_url():
    url = BASE_URL + "/team/list_html/"
    res = requests.get(url)
    soup = BeautifulSoup(res.content, "html.parser")
    content = soup.find(id="main_contents_outer")
    teams_content = content.find_all(class_="team_block")
    team_list = []
    for div in teams_content:
        name = re.sub(r"[\s]","",div.find("h3").text)
        uri_block = div.find(class_="btn09")
        uri = uri_block.get("href")
        team_list.append({"name": name, "uri": uri})
    return team_list

def get_playersdata(team):
    url = BASE_URL + team["uri"]
    res = requests.get(url)
    soup = BeautifulSoup(res.content, "html.parser")
    div = soup.find(class_="team-color-table")
    table = div.find('table')
    blocks = table.findAll('tr')

    players_data = []
    for block in blocks:
        data = {}
        values = block.findAll('td')
        if len(values) == 0:
            continue
        data["team"] = team["name"]
        data["num"] = values[0].text
        data["name"] = re.sub(r"[\s]","",values[1].text)
        data["url"] = BASE_URL + values[1].a.get('href')
        data["position"] = values[2].text
        data["height"] = values[3].text
        data["weight"] = values[4].text
        data["birth"] = values[5].text
        data["home"] = values[6].text
        data["career"] = values[7].text
        detail = get_player_detail(data["url"])
        data["blood"] = detail["blood"]
        data["nickname"] = detail["nickname"]
        data["ppg"] = detail["ppg"]
        data["rpg"] = detail["rpg"]
        data["apg"] = detail["apg"]
        players_data.append(data)
    return players_data

def get_player_detail(url):
    res = requests.get(url)
    soup = BeautifulSoup(res.content, "html.parser")
    table = soup.findAll('table', class_="table04")
    data = {}
    data["blood"] = table[0].findAll('td')[5].text
    data["nickname"] = table[0].findAll('td')[6].text
    data["ppg"] = table[1].findAll('td')[0].text
    data["rpg"] = table[1].findAll('td')[1].text
    data["apg"] = table[1].findAll('td')[2].text
    return data

def write_to_sheet(sheet, team_data):
    cell_list = sheet.range('A1:O20')
    i = 0
    for player in team_data:
        data = list(player.values())
        for n in range(15):
            cell_list[i].value = data[n]
            i += 1
    
    while cell_list[i].value != "":
        cell_list[i].value = ""
        i += 1
    sheet.update_cells(cell_list)

if __name__ == "__main__":
    team_list = list_team_url()

    for team in team_list:
        team_name = team['name']
        team_data = get_playersdata(team)
        sheets = G_CLIENT.open_by_key(SHEET_ID)
        try:
            team_sheet = sheets.worksheet(team_name)
        except:
            print('new '+team_name)
            team_sheet = sheets.add_worksheet(title=team_name, rows="30", cols="20")
        write_to_sheet(team_sheet, team_data)


相違点

  • チーム名を自動取得にした
    TwitterBリーグ版広島が反応しないと言われ、よくみたら手動で書き起こしていたチーム一覧に広島が入っていなかった。人間がやるからミスするんだよ・・・
  • 選手情報がチームのロスター一覧で取れるものと選手個人ページで取れるものが違ったためにget_playersdataのなかでget_player_detailを呼び、2段階で取得している

…くらいかな


なおこちらは絶対に週末しか試合をしない&できたのがプレーオフ直前でほとんどスタッツを更新する必要がなさそうだったのでローカルで実行しています。
来シーズン始まったらBリーグ版同様Herokuにのせようかな。

まとめ

  • ほとんど流用なので、全部で2時間ほどでできた(スクレイピング1時間+LINE接続30分+文章その他整形30分)
  • 100行くらいでスッキリ
  • 自動化できるところは自動化しましょう

雑で内容ほとんど解説してないので、なにか聞きたいことあればお気軽にどうぞ。


W杯楽しみですね!!! 🇺🇸🇹🇷🇨🇿🇯🇵

Bリーグの選手情報を返すLINE Botを作った② ~ GASでスプレッドシートを参照するLINE Botを作る ~

復習

こちらの続きです。


選手情報を書き込んだスプレッドシートができたので、いよいよLINE Botを作ります。

LINE Botを作ろう!サーバーはどこで動かす?

Botを作るにあたり、LINEで作ることは決めていたのですが、サーバーサイドをどうするかは決めていませんでした。

色々ググっているうちに、GASというものを知りました。

GAS

GoogleAppsScript.
日頃から大変お世話になっているGoogle様のサービスです。


無料で使える! Webアプリケーションとして公開できる!


というわけで使ってみました。
(実は今回初めて知りました。先に前回のスクレイピングのプログラムだけ作っていて、あとからGASから参照するのにスプレッドシートが楽だったためスプレッドシートに書き込むようにしました。)

LINEと繋ぐ

とりあえずLINEと接続してデバッグできるようにしよう!
と以下の記事を参考に作り始めました。

qiita.com

なるほど30分でできるのね〜


...


...


2時間経っても返事をしてくれない!


調べまわった結果、わかりました。


これです。

matonton.hatenablog.com


ウェブアプリケーションとして導入」で更新する際に、プロジェクトバージョンを"New"にしなければいけなかったんですね。

最初起動したときにアクセストークンをコピーし間違えていて、修正したのです。
それがいつまでも反映されていなかったんですね。。。
というわけで、LINEとつながり、更新の仕方も把握しました。

function doPost(e) {  
  var events = JSON.parse(e.postData.contents).events;
  events.map(function(event) {
    var replyToken = event.replyToken;
    var userMessage = event.message.text;
    
   // makeReplyMessageで返答メッセージを作るようにする
    var replyMessage = makeReplyMessage(userMessage);
    
    var replyContent = {
      "replyToken":replyToken,
      "messages":[
        {
          "type":"text",
          "text": replyMessage
        }
      ]
    };
    
    UrlFetchApp.fetch(REPLY_URL, makeOptions(replyContent));
  });

  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

// あとでちょっと使い回すから分けてます
function makeOptions(replyContent){
    var options = {
    'headers': {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer '+ACCESS_TOKEN
    },
    'method': 'POST',
    'payload': JSON.stringify(replyContent)
  }
    return options;
}

送られてきたテキストからチーム名と背番号を抽出する

チーム名抽出。もうここはゴリッゴリにハードコーディング

function detectTeam(message) {
  if(checkInclude(message, ["レバンガ","北海道"])){ return "レバンガ北海道";
  } else if(checkInclude(message, ["秋田","ハピネッツ","ノーザン"])){ return "秋田ノーザンハピネッツ";
  } else if(checkInclude(message, ["栃木","ブレックス","リンク"])){ return "栃木ブレックス";
  } else if(checkInclude(message, ["千葉","ジェッツ","ふなばし"])){ return "千葉ジェッツふなばし";
  } else if(checkInclude(message, ["アースフレンズ","東京Z","アスフレ"])){ return "アースフレンズ東京Z";
  } else if(checkInclude(message, ["アルバルク","東京","トヨタ"])){ return "アルバルク東京";
  } else if(checkInclude(message, ["サンロッカーズ","渋谷"])){ return "サンロッカーズ渋谷";
  } else if(checkInclude(message, ["川崎","ブレイブサンダース","ブレサン"])){ return "川崎ブレイブサンダース";
  } else if(checkInclude(message, ["横浜","ビーコル","コルセアーズ"])){ return "横浜ビー・コルセアーズ";
  } else if(checkInclude(message, ["新潟","アルビ"])){ return "新潟アルビレックス";
  } else if(checkInclude(message, ["富山","グラウ"])){ return "富山グラウジーズ";
  } else if(checkInclude(message, ["三遠","ネオ"])){ return "三遠ネオフェニックス";
  } else if(checkInclude(message, ["シーホース","三河","アイシン"])){ return "シーホース三河";
  } else if(checkInclude(message, ["イーグルス"])){ return "Fイーグルス名古屋";
  } else if(checkInclude(message, ["名古屋","ダイヤモンド","ドルフィンズ"])){ return "名古屋ダイヤモンドドルフィンズ";
  } else if(checkInclude(message, ["滋賀","レイク"])){ return "滋賀レイクスターズ";
  } else if(checkInclude(message, ["京都","ハンナリ"])){ return "京都ハンナリーズ";
  } else if(checkInclude(message, ["大阪","エヴェッサ","エべッサ"])){ return "大阪エヴェッサ";
  } else if(checkInclude(message, ["ライジングゼファー","福岡"])){ return "ライジングゼファー福岡";
  } else if(checkInclude(message, ["琉球","キングス"])){ return "琉球ゴールデンキングス";
  } else if(checkInclude(message, ["青森","ワッツ"])){ return "青森ワッツ";
  } else if(checkInclude(message, ["仙台","ERS","ers"])){ return "仙台89ERS";
  } else if(checkInclude(message, ["山形","ワイヴァンズ"])){ return "山形ワイヴァンズ";
  } else if(checkInclude(message, ["福島","ファイヤーボンズ"])){ return "福島ファイヤーボンズ";
  } else if(checkInclude(message, ["茨城","ロボッツ"])){ return "茨城ロボッツ";
  } else if(checkInclude(message, ["群馬","クレインサンダーズ"])){ return "群馬クレインサンダーズ";
  } else if(checkInclude(message, ["八王子","ビートレインズ"])){ return "八王子ビートレインズ";
  } else if(checkInclude(message, ["金沢","武士"])){ return "金沢武士団";
  } else if(checkInclude(message, ["信州","ブレイブウォリアーズ"])){ return "信州ブレイブウォリアーズ";
  } else if(checkInclude(message, ["西宮","ストークス"])){ return "西宮ストークス";
  } else if(checkInclude(message, ["バンビシャス","奈良"])){ return "バンビシャス奈良";
  } else if(checkInclude(message, ["島根","スサノオマジック"])){ return "島根スサノオマジック";
  } else if(checkInclude(message, ["香川","ファイブアローズ"])){ return "香川ファイブアローズ";
  } else if(checkInclude(message, ["愛媛","オレンジ","バイキングス"])){ return "愛媛オレンジバイキングス";
  } else if(checkInclude(message, ["熊本","ヴォルターズ"])){ return "熊本ヴォルターズ";
  } else { return undefined;
  }
}

function checkInclude(text, matchArary) {
  var flg = false;
  matchArary.some(function(key){
    if(text.match(key)) {
      flg = true;
      return true;
    }
  });
  return flg;
}

B2を追加したら東京と名古屋が2チームとなり、仙台はチーム名に番号入ってる...!!!(後述)とかありましたがB1優先にさせて頂きました。


次に、番号を抽出します。

function detectNum(message) {
  // 全角数字を半角に直す
  message = message.replace(/[0-9]/g, function(s){
    return String.fromCharCode(s.charCodeAt(0) - 65248);
  });
  # 仙台89ERSから89を抽出しないようにする
  if (message.match("89ERS")) message = message.replace("89ERS","");
  if (message.match("89ers")) message = message.replace("89ers","");
  if (message.match("仙台89")) message = message.replace("仙台89","");
  num = message.replace(/[^0-9]/g,"")
  return num;
}

仙台に89番の選手がいなくて良かった。(永久欠番になってたりする?)

スプレッドシートから選手情報を取得する

function getPlayersListByTeam(team) {
  // 参照したいシートのURL(https://docs.google.com/spreadsheets/d/{$SHEET_ID}/edit)からシートIDがわかります
  var spreadsheet = SpreadsheetApp.openById(SHEET_ID);

  // チームごとにシートを分けているのでチーム名が一致するシートを取得します
  // (どちらもシートでややこしいけどopenByIDで開いているspreadsheetがexcelでいうところのブック)
  var sheet = spreadsheet.getSheetByName(team);
    
  var players_list= [];
  var lastRow = sheet.getLastRow();    // 空白でない最終行を返してくれる

  var range_values = sheet.getRange(1,1,lastRow,20).getValues();
  for (var r = 0; r < lastRow; r++) {
    var values = range_values[r];
    # key-valueに整形
    var data = {
      "url": values[1],
      "name": values[2],
      "name_en": values[3],
      "num": values[4],
      "position": values[5],
      "school": values[6],
      "home": values[7],
      "birth": values[8],
      "height": values[9],
      "weight": values[10],
      "contry": values[11],
      "pta": values[12],
      "rba": values[13],
      "asa": values[14],
      "sta": values[15],
      "bla": values[16],
      "fgp": values[17],
      "tpp": values[18],
      "ftp": values[19],
    }
    players_list.push(data);
  }
  return players_list;
}

var range_values = sheet.getRange(1,1,lastRow,20).getValues();では1行分の値が一つの配列になっている配列の配列が返ってきます。
スプレッドシートとのやりとりをなるべく減らすため、1チーム分まるっと取得して選手ごとにkey-valueにまとめた配列を返すようにしました。

リプライメッセージを作る

function makeReplyMessage(message) {
  var team = detectTeam(message);
  if (!team) return "チーム名がわかりませんでした。";
  team_players_data = getPlayersListByTeam(team);
  
  var num = detectNum(message);
  
  var num = detectNum(message);
  if(!num){
    return "番号が分かりませんでした。\nチームと背番号を言ってね。\n"+team+makePlayersListString(team_players_data);
  }
  
  // 背番号一致を探す
  var result = team_players_data.filter(function(player) { return player.num == num;})[0];
  if (result) {
    var format = team+'\n';
    format += '#'+result.num+'\n';
    format += result.name+'/'+result.name_en+'\n';
    format += result.position+'\n';
    format += '出身校:'+result.school+'\n';
    format += '出身地/国籍:'+result.home+'/'+result.contry+'\n';
    format += result.birth+'生\n';
    format += result.height+'/'+result.weight+'\n';
    format += 'FG: '+result.fgp+', 3P: '+result.tpp+', FT: '+result.ftp+'\n';
    format += 'PPG: '+result.pta+', RPG: '+result.rba+', APG: '+result.asa+'\n';
    format += 'SPG: '+result.sta+', BPG: '+result.bla+'\n';
    format += result.url;
    return format;
  } else {
    return "選手情報が見つかりませんでした。\n"+team+makePlayersListString(team_players_data);
  }
}

function makePlayersListString(playersdatalist) {
  var list_string = '';
  playersdatalist.map(function(data){
    list_string += '\n#'+data.num+' '+data.name;
  });
  return list_string;
}

試合をみている時以外に「あの選手どこ出身なのかな〜」と思ったときに番号がわからなかったので、番号がないときは背番号付きのリストを返すようにしました。

できたよ

チーム名+背番号でプロフィールと簡単なスタッツを返します。

おまけ(だけど結構大事だと思う)

LINE Messaging APIGUIから作るアクセストークンって最長で24時間となっていて、毎日更新するのが面倒なので自動でリフレッシュするようにします。
調べたらちゃんとAPIありました。

チャネルアクセストークンを発行する

function refreshToken() {
  var options = {
    'headers':{
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    'method': 'POST',
    'payload': {
      'grant_type': 'client_credentials',
      'client_id': CLIENT_ID,
      'client_secret': CLIENT_SECRET
    }
  }
  var res = UrlFetchApp.fetch(REFRESH_URL, options);
  ACCESS_TOKEN = JSON.parse(res).access_token;
}

というわけでLINEへのリプライが送れなかったらrefreshするようにして、あとは放置。

感想

  • 初めてプライベートで最後まで作った!
  • 実はjavascriptも初めて!(仕事でtypescriptは触ってたよ)
  • GASの編集画面でカーソルが消えるのは仕様ですか?PC(もといブラウザ)との相性が悪い?
  • スクレイパーもGASに移行しようと思ったらUrlFetchAppで取ってきたhtmlが不完全で選手一覧が入ってなくて諦めました。誰か教えてください


友人に紹介するとみんな推し選手を一番最初に調べるのが微笑ましかったです。