きっかけは9月のある夜、充電スタンドが見つからなかったこと…… 実はその前にすでに南哪充電のウェブページがあった: https://charge.zhuxh.net/

ただ、個人的に使ってみた感じではまだ物足りなく、どこが空いているか一目でわかるだけだが、充電スタンドが圧倒的に不足しているため、充電したい時は全部赤か、唯一の緑が遠い場所にあることが多い。
そこで自分でも作ることにした。予想残り時間を表示できれば、事前に待機しやすくなるから 、みんなを蹴落とす
バックエンドでデータをスクレイピング
スクレイピングは私にとってまだ簡単で、いくつかスクレイピング関連プロジェクトを書いたことがあるし、Reqable起動!
充電ステーションIDを取得
まず閃开来電のリクエストの中から南大仙林の充電ステーションをフィルタリングし、充電ステーションのstation_idを取得する。このステップは手動で書き写すだけで、具体的なIDは以下の通り:
各充電ステーションのコンセントIDを取得
前のステップは33個の充電ステーションだけで、手で書き写すのもまだ許せるが、302個のコンセントIDも手で書き写すのは勘弁してほしい。
2025年6月16日追記:なぜ新しく追加された充電スタンドは一つのステーションにコンセントが2つだけというのが多くて、今日station_idを長いこと手で書き写すことになった。現在、仙林キャンパスには累計112個の充電ステーション、724個のコンセントがある。
f'https://wemp.issks.com/charge/v1/outlet/station/outlets/{station_id}'から各充電ステーションの情報を取得でき、そこにコンセントのIDが含まれている。
ついに、各コンセントの状態を取得しよう
前のステップで各充電ステーション(例えば天文学院)の各充電コンセントのoutletNoを取得できたので、このステップではoutletNoに基づいて、f'https://wemp.issks.com/charge/v1/charging/outlet/{outletNo}'から各コンセントの具体的な状態を取得できる!
返却例:
実は中には不要な情報が多く、ここではコンセント名、予想残り時間、使用済み時間、ステータスコード(空き、故障、分単位課金モード、固定金額モード)、エラー情報の有無だけを取得すればよく、さらに予想使用可能時間を計算してフロントエンドで直接表示できるようにする(フロントエンドが本当に苦手なので)。コードは以下の通り:
幸いなことに、状態を取得するこのステップにはトークンが不要で、各ステーションの下のコンセントは完全に固定されている。その後データを更新するには、既存のoutletNoに基づいてこのステップを繰り返せばいい。
データの後処理
自分でデプロイする際はマルチスレッドで実行し(302件のデータなら基本的に2秒程度で完了し、実際に試してもレート制限にかからない)、バックエンドサーバーで毎分データを更新している。
フロントエンドからの呼び出しを便利にするため、バックエンドでデータを残り時間でソートし、充電ステーションを元のxx号機からxx棟に分類し直した:
第一版フロントエンド
フロントエンドは全くの素人なので、第一版のフロントエンドはPythonで生成した。>︿< 公開してみんなに笑ってもらおう
そしてインターフェースもかなり簡素だが、一応GPTにjsコードを生成してもらってステーションのフィルタリングに使った

第二版フロントエンド
第二版と呼んでも、数行のCSSを書いてこのインターフェースを救おうとしただけだ。

第三版フロントエンド
新しいバージョンの個人ホームページを作り始め、Mix SpaceがMarkdown with JavaScriptをサポートしているので、/charge.htmlを個人ホームページの下に配置し、元のフィルタリング機能も改良して、フィルタリングと同時にURLパラメータを変更するようにした。これで更新後も前回ユーザーがフィルタリングしたステーションを記憶して直接表示できる。

第四版フロントエンド
第一版からテーブルで表示していたため、上の画像からもわかるように、より一般的な利用シーンであるスマホでの体験は正直お世辞にも言えない。そこで半日かけてUIをリファクタリングし、冒頭に統計テーブルを追加して、より便利に充電先を計画できるようにした。

基本的にすべてのフロントエンド・バックエンドコードは以下のGitHubリポジトリにある。自由に使っていいがMITライセンスを遵守し、使用時は私の著作権情報を残しておいてほしい。
その後の小さなアップデート
- 2024-12-01:鼓楼キャンパスを追加。
- 2025-01-07:今日突然、充電にはチャージ後に分単位で課金されることが必要だと気づいた、なんてこった。使用済み時間の逆順で更新し、閃開充電の説明によると、この時間は最大480分で、少なくともどの充電スタンドがもうすぐ終わるかを大体知る参考にはなる。
- 2025-02-22:分単位課金モードではユーザーが事前チャージ金額を自分で選べるようになったため、これに基づいて予想使用可能時間を推定できるようになった。ただし、満充電するために高めに選ぶ人もいること、およびAPIの返却値の精度が低いため計算精度も低いことを考慮し、あくまで参考としてください。電力量課金モードも理論的には推定可能だが、APIで直接電力を読み取る方法がないため、今のところは実装しない。
- 2025-06-16:鼓楼と仙林の複数の充電スタンドを追加。(コンセント数の変化:鼓楼148→308、仙林302→724)
- 2025-06-22:システムで設定されている最長充電時間は480分のようなので、これに基づいて残り時間の予想を修正した。
- 2025-09-09:履歴充電記録機能を削除。
- 2025-10-11:充電スタンドを更新。