私が作成した南哪充電-鼓楼または南哪充電-仙林にアクセスしてください。
このすべての始まりは、9月のある夜、充電スタンドが見つからなかったことです…… 実はその前からすでに南哪充電のウェブページがありました: https://charge.zhuxh.net/

しかし個人的に使ってみると、まだ物足りなさを感じました。一目でどこに空きがあるかはわかりますが、充電スタンドが極端に不足しているため、充電したいときに一面真っ赤だったり、わずかな緑色の場所が遠く離れていたりすることがよくありました。
そこで私も自分で作ることにしました。予想残り時間を表示して、事前に待機しやすくするために 、みんなを出し抜く
バックエンドでのデータスクレイピング
スクレイピングは私にとってはかなり簡単です。何しろすでにいくつかのスクレイピング関連プロジェクトを書いてきました。Reqable起動!
充電ステーションIDの取得
まず、闪开来电(Shankai Laidian)のリクエストの中から南京大学仙林キャンパスに属する充電ステーションをフィルタリングし、充電ステーションの station_id を取得します。このステップは完全に手作業での転記です。具体的なIDは以下の通りです:
各充電ステーションのコンセントIDの取得
前のステップでは充電ステーションが33個だけだったので、手作業でもなんとか受け入れられましたが、302個のコンセントIDまで手作業で転記するのは勘弁してください。
2025年6月16日追記:なぜ新しく追加された充電スタンドの多くが、1つの充電ステーションにコンセントが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 に基づいてこのステップを繰り返し実行するだけでOKです。
データの後処理
自分でデプロイする際にはマルチスレッドを使用し(302件のデータは基本的に2秒程度で完了し、実際にテストしても風控(リスク制御)に引っかかることはありませんでした)、バックエンドマシンで1分ごとにデータを更新するようにタイマー設定しています。
フロントエンドからの呼び出しを容易にするため、バックエンドでデータを残り時間順にソートし、充電ステーションの分類を元の「xx号機」から「xx棟」に変更しました:
第一版フロントエンド
何しろフロントエンドの素人なので、私の第一版フロントエンドはPythonで生成したものです。>︿<
皆さんに笑ってもらうために公開します
しかもインターフェースもかなり粗末でしたが、それでもGPTに頼んでステーションをフィルタリングするためのJavaScriptコードを生成してもらいました

第二版フロントエンド
いわゆる第二版は、数行の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:充電スタンドを更新。