Helps to find available slots on zh.vacme.ch corona vaccination service

vacme-zurich-parser

https://zh.vacme.ch provides a way to register for vaccination in Zurich. Since there is not much free slots - its quite tedious to find available one. Recently dropdown was updated to filter not available ones, but unfortunately active options often dont have slots either.

This service (https://vacme.kloud.top) tries to simplify search by exposing rest api and UI with up to date available slots for vaccination in Zurich.
Be aware is uses personal refresh token for existing registration and reverse engineered api, so its all quite fragile - any next update of vacme.ch can break it.

Main part if you want to reuse code is in parser folder. Its python app which periodically calls zh.vacme.ch, and exposes basic api for UI and caching layers.
Its was just jupiter experiment (see original vaccination_search.ipynb) wrapped into api and extended with token refresh.

Currently, deployed to https://vacme.kloud.top with refresh interval ~3 min and with my account for group N.

zh.vacme.ch is for Zurich only, please check other cantons on https://foph-coronavirus.ch/vaccination/when-can-i-be-vaccinated/#cantons

Stay safe! ;)

UPD: I've found similar service https://rimpfli.web.app - check it out as well. It has Bern in addition to Zurich and notifications!

ui screenshot

possible todo

  • notifications in UI (?)
  • contact locations to get an info of which vaccine is in use there (?)
  • store/show statistics about slots per day etc
  • automatic SMS login

API

Here is main caching flat api providing appointment data and geo https://vacme.kloud.top/api/v2/locations for UI display.
Example response:

{
  "vaccination_group": "N",
  "last_refresh": 1621085095601,
  "refresh_interval_sec": 250,
  "locations": [
    {
      "name": "Zürich, TopPharm Morgental Apotheke",
      "id": "00d65270-264f-469f-bdac-765d01d2b14c",
      "noFreieTermine": true,
      "latitude": 47.3437185858769,
      "longitude": 8.529828454511142,
      "link": "https://goo.gl/maps/8VFBvGnSGrZJLHW98"
    },
    {
      "name": "_Impfzentrum Wetzikon",
      "id": "fcfae361-7a74-481d-bc6b-e257e1ddb1de",
      "noFreieTermine": false,
      "firstDate": 1623067200000,
      "secondDate": 1625486400000,
      "latitude": 47.31518772182702,
      "longitude": 8.79995562696232,
      "link": "https://goo.gl/maps/J9sD4ByixUrAQaes9"
    },
    .....
  ]
}

noFreieTermine and id fields are propagated from vacme.ch directly.

See parser only api in parser folder.

local deployment

if you want to run it locally, find your REGISTRATION_ID and REFRESH_TOKEN from browser network tab and run:

docker run --rm -it -e REGISTRATION_ID=? -e REFRESH_TOKEN=? golonzovsky/vacme-parser

or run python code directly.

cloud deployment

In case you want to run it in the cloud - sometimes api starts to redirect into captcha. AFAIK once captcha is solved - IP is added, and you can call vacme again.

If you run in k8s - you need to hide your nodes behind NAT. Then you can to solve captcha from behind NAT ip using socks proxy. Example to create local SOCKS proxy from private GKE node:

gcloud beta compute ssh --zone "europe-west6-a" "gke-main-preemptible-e2-medium-3b140cfc-wv1s" --tunnel-through-iap -- -N -p 22 -D localhost:5000

UPD: added all infra code, see https://github.com/golonzovsky/vacme-zurich-parser/tree/main/infrastructure folder. Its terraform definitions of GKE cluster and things around running in GCP.

Similar Resources

Helps you to send ssh commands to target machine in your local network from outside via gRPC

Helps you to send ssh commands to target machine in your local network from outside via gRPC

rpc-ssh In case, you don't want to make your ssh port accessible from outside local network. This repository helps you to send ssh commands to target

Nov 16, 2022

It's an auxiliary tool ,and it helps the blue team track the attackers

It's an auxiliary tool ,and it helps the blue team track the attackers

pdog pdog - Threat Intelligence pdog - OSINT It's an auxiliary tool ,and it helps the blue team track the attackers Example useage: Usage: [comma

Dec 22, 2021

JPRQ Customizer is a customizer that helps to use the JPRQ server code and make it compatible with your own server with custom subdomain and domain

JPRQ Customizer is a customizer that helps to use the JPRQ server code and make it compatible with your own server with custom subdomain and domain

JPRQ Customizer is a customizer that helps to use the JPRQ server code and make it compatible with your own server with custom subdomain and domain.You can upload the generated directory to your web server and expose user localhost to public internet. You can use this to make your local machine a command center for your ethical hacking purpose ;)

Jan 19, 2022

Go-Web-Dev - Golang helps the developer to develop highly scalable applications

Go-Web-Dev Golang helps the developer to develop highly scalable applications. T

Feb 5, 2022

Tentez helps you switching traffic.

Tentez Tentez helps you switching traffic. Usage # show plan $ tentez -f ./examples/example.yaml plan Plan 1. pause 2. switch old:new = 70:30 - tent

Dec 23, 2022

netscanner - TCP/UDP scanner to find open or closed ports

netscanner netscanner - TCP/UDP scanner to find open or closed ports installation you have to run this command to install the program $ go get github.

Dec 19, 2022

red-tldr is a lightweight text search tool, which is used to help red team staff quickly find the commands and key points they want to execute, so it is more suitable for use by red team personnel with certain experience.

red-tldr is a lightweight text search tool, which is used to help red team staff quickly find the commands and key points they want to execute, so it is more suitable for use by red team personnel with certain experience.

Red Team TL;DR English | 中文简体 What is Red Team TL;DR ? red-tldr is a lightweight text search tool, which is used to help red team staff quickly find t

Jan 5, 2023

Kubectl-explore - A kubectl plugin for fuzzy-find fields to explain.

kubectl-explore This command is a better kubectl explain with the fuzzy-finder. What kubectl-explore finds fields associated with each supported API r

Dec 29, 2022

Ffind - A tool to find files of interest on a compromised host during a penetration test

Ffind - A tool to find files of interest on a compromised host during a penetration test

ffind ffind is a tool to find files of interest on a compromised host during a p

Jul 25, 2022
Comments
  • 403 forbidden error

    403 forbidden error

    Hi @golonzovsky,

    I was doing quite the same parsing for be.vacme.ch. So nice that you shared your code! Thanks.

    Currently I have some issues with the authentication. Sometimes I get a 403 forbidden error. Did you also notice it? How did you solve it?

    Thanks for your help. Cheers from Bern

  • How to build a local deployment for ARM64?

    How to build a local deployment for ARM64?

    Hi!

    Unfortunately, the golonzovsky/vacme-parser image is only provided for amd64/x86, so my ARM64 machine can't run it. I'm a bit confused how to get the Docker container for backend and frontend running. I built a new container, with the parser Dockerfile, but running the image in a container results in an error:

    docker run --rm -it -e REGISTRATION_ID=XXXX -e REFRESH_TOKEN=eyJhbGciOiJI... golonzovsky/vacme-parser:arm64
    Traceback (most recent call last):
      File "/app/main.py", line 202, in <module>
        config.load_incluster_config()
      File "/usr/local/lib/python3.9/site-packages/kubernetes/config/incluster_config.py", line 118, in load_incluster_config
        InClusterConfigLoader(
      File "/usr/local/lib/python3.9/site-packages/kubernetes/config/incluster_config.py", line 54, in load_and_set
        self._load_config()
      File "/usr/local/lib/python3.9/site-packages/kubernetes/config/incluster_config.py", line 62, in _load_config
        raise ConfigException("Service host/port is not set.")
    kubernetes.config.config_exception.ConfigException: Service host/port is not set.
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/app/main.py", line 204, in <module>
        config.load_kube_config()
      File "/usr/local/lib/python3.9/site-packages/kubernetes/config/kube_config.py", line 792, in load_kube_config
        loader = _get_kube_config_loader(
      File "/usr/local/lib/python3.9/site-packages/kubernetes/config/kube_config.py", line 751, in _get_kube_config_loader
        raise ConfigException(
    kubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.
    

    What am I missing here?

  • Great tool! Why is the time not set to Zürich time?

    Great tool! Why is the time not set to Zürich time?

    1. Thank you for the great tool!
    2. Why is the time not set to Zürich time?
    3. {"last_refresh":"Mon, 10 May 2021 13:20:25 GMT","locations":[],"refresh_interval_sec":600,"source":"https://github.com/golonzovsky/vacme-zurich-parser","vaccination_group":"N"}
  • Make `Impfzentrum` Links clickable

    Make `Impfzentrum` Links clickable

    Is it possible to make the Impfzentrum Links clickable so the user is directly taken to the booking site? @baryluk this could be an interesting project for you too.

Cf-cli-find-app-plugin - CF CLI plugin to find applications containing a search string

Overview This cf cli plugin allows users to search for application names that co

Jan 3, 2022
Compiler as a Service is a compiler that is available over http/https and gRPC

BlakBoks(CaaS) Elasticsearch but for compiling untrusted code Compiler as a Service is a compiler that is available over http/2 and gRPC. Setup First

Nov 24, 2021
Service that calls uzma24/project1 service, takes input from .txt file and prints JSON output returned from the service.

Service that calls uzma24/project1 service, takes input from .txt file and prints JSON output returned from the service. Program can take large input files.

Feb 6, 2022
A Stable & Secure Tunnel based on KCP with N:M multiplexing and FEC. Available for ARM, MIPS, 386 and AMD64。KCPプロトコルに基づく安全なトンネル。KCP 프로토콜을 기반으로 하는 보안 터널입니다。
A Stable & Secure Tunnel based on KCP with N:M multiplexing and FEC. Available for ARM, MIPS, 386 and AMD64。KCPプロトコルに基づく安全なトンネル。KCP 프로토콜을 기반으로 하는 보안 터널입니다。

Disclaimer: kcptun maintains a single website — github.com/xtaci/kcptun. Any websites other than github.com/xtaci/kcptun are not endorsed by xtaci. Re

Jan 9, 2023
fbstatus graphically shows the gokrazy system status on the Linux frame buffer, which is typically available via HDMI when running on a Raspberry Pi or a PC.
fbstatus graphically shows the gokrazy system status on the Linux frame buffer, which is typically available via HDMI when running on a Raspberry Pi or a PC.

gokrazy framebuffer status (fbstatus) fbstatus graphically shows the gokrazy system status on the Linux frame buffer, which is typically available via

Aug 4, 2022
WebsiteChecker - A GoLang program that verifies if a website is available or not

Website Checker ?? This is my first program in Go! The purpose of this applicati

Apr 30, 2022
This package helps establish a websocket connection to the bilibili streaming server.

biliStreamClient This package helps establish a websocket connection to the bilibili streaming server. bilibili直播弹幕的WebSocket协议分析请参考:https://blog.csdn

Oct 25, 2022
A tool helps connect to your AriPods when sound playing in your Mac

Auto connect to airpods this tool helps connect to your AriPods when sound playing in your Mac. dependencenes SwitchAudioSource $ brew install switcha

Dec 9, 2021
Hedged Go GRPC client which helps to reduce tail latency at scale.

hedgedgrpc Hedged Go GRPC client which helps to reduce tail latency at scale. Rationale See paper Tail at Scale by Jeffrey Dean, Luiz André Barroso. I

Dec 16, 2022
Project helps to identify the network, broadcast address and no of possible hosts

network_identifier Project helps to identify the network, broadcast address and no of possible hosts for Ipv4 address To use it directly as a go file

Dec 3, 2021