{"id":14979583,"url":"https://github.com/yihong0618/githubposter","last_synced_at":"2025-05-13T20:22:55.005Z","repository":{"id":42508939,"uuid":"360028025","full_name":"yihong0618/GitHubPoster","owner":"yihong0618","description":"Make everything a GitHub svg poster and Skyline!","archived":false,"fork":false,"pushed_at":"2025-04-28T00:19:09.000Z","size":161907,"stargazers_count":1803,"open_issues_count":9,"forks_count":293,"subscribers_count":9,"default_branch":"main","last_synced_at":"2025-04-28T11:56:36.021Z","etag":null,"topics":["bilibili","dota2","duolingo","github-svg-poster","gitlab","gpx","kindle","leetcode","shanbay","skyline","strava","twitter","wakatime","xhr","youtube"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yihong0618.png","metadata":{"files":{"readme":"README-EN.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-04-21T04:06:34.000Z","updated_at":"2025-04-28T00:19:13.000Z","dependencies_parsed_at":"2024-03-17T02:18:54.676Z","dependency_job_id":"928e3422-e6c3-49c7-82f0-e641ed93e6f9","html_url":"https://github.com/yihong0618/GitHubPoster","commit_stats":{"total_commits":1072,"total_committers":33,"mean_commits":"32.484848484848484","dds":"0.14925373134328357","last_synced_commit":"d872b297231566b81987526322a76c29a0e51e42"},"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yihong0618%2FGitHubPoster","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yihong0618%2FGitHubPoster/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yihong0618%2FGitHubPoster/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yihong0618%2FGitHubPoster/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yihong0618","download_url":"https://codeload.github.com/yihong0618/GitHubPoster/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251311332,"owners_count":21569008,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bilibili","dota2","duolingo","github-svg-poster","gitlab","gpx","kindle","leetcode","shanbay","skyline","strava","twitter","wakatime","xhr","youtube"],"created_at":"2024-09-24T14:00:21.043Z","updated_at":"2025-04-28T11:56:42.148Z","avatar_url":"https://github.com/yihong0618.png","language":"Python","readme":"# GitHubPoster\n\nMake everything a GitHub svg poster and [skyline](https://skyline.github.com/)!\n\n##  `svg` in `README` examples\n\n![](https://github.com/yihong0618/GitHubPoster/blob/main/examples/twitter.svg)\n\n## Circular\n\n![](https://github.com/yihong0618/GitHubPoster/blob/main/examples/strava_circular.svg)\n\n## Skyline\n\n![image](https://user-images.githubusercontent.com/15976103/120966953-80d07180-c799-11eb-8769-92554905ab3f.png)\n\n## Support\n\n- **[Strava](#strava)**\n- **[Nintendo Switch](#ns)**\n- **[GPX](#GPX)**\n- **[Duolingo](#duolingo)**\n- **[Issue](#Issue)**\n- **[YouTube](#Youtube)**\n- **[Bilibili](#Bilibili)**\n- **[GitHub](#GitHub)**\n- **[GitLab](#GitLab)**\n- **[Kindle](#Kindle)**\n- **[WakaTime](#WakaTime)**\n- **[Dota2](#Dota2)**\n- **[Nike](#Nike)**\n- **[Notion](#Notion)**\n- **[Garmin](#Garmin)**\n- **[Forest](#Forest)**\n- **[Json](#Json)**\n- **[Multiple](#Multiple)**\n- **[Jike](#Jike)**\n- **[Summary](#Summary)**\n- **[Todoist](#Todoist)**\n- **[OpenLanguage](#OpenLanguage)**\n- **[Apple Health](#AppleHealth)**\n- **[ChatGPT](#ChatGPT)**\n- **[NeoDB](#NeoDB)**\n- **[AutoSleep](#AutoSleep)**\n\n## Download\n```\ngit clone https://github.com/yihong0618/GitHubPoster.git\n```\n## pip install\n\n```\npip3 install -U 'github_poster[all]'\n```\n\n## Install(Python3.6+)\n```\npip3 install -r requirements.txt\n```\n\n## Use\n\nThe generated svg is in `OUT_FOLDER`, named with type (for now)\n\nDifferent types are used as specified below:\n\n- `--year 2021`: You can specify a year (default) or a year range `--year 2012-2021`\n- `--special-number1 10 -- special_number2 20`: By default, the number of different colors is automatically generated (special colors), you can also specify the color\n- `--special-color1 pink --special-color2 '#33C6A4'`: You can also specify the color\n- `--with-animation`: You can add animation (add GOGOGO animation)\n- `--animation-time 14`: you can control the animation time (default is 10s), use with `--with-animation`\n- `--with-skyline`: You can save skyline `stl` file (default skyline year is to_year),\n- `--skyline-with-name`: set to print user name on model, use with `--with-skyline`\n- `--is-circular`: With this command, the svg will be circular and with animation\n- `--without-type-name`: Support for hiding the name of the build type in the title\n- `---stand-with-ukraine`\n\nOther parameters can be found with `python3 -m github_poster \u003ctype\u003e --help`\n\n\n### GPX\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eGPX\u003c/code\u003e GitHub poster\u003c/summary\u003e\n\u003cbr\u003e\n\nmv gpx files to `GPX_FOLDER` then run the code\n```\npython3 -m github_poster gpx --gpx_dir ~/blog/GPX_OUT/ --year 2013-2021\nor pip\ngithub_poster github_poster gpx --gpx_dir ~/blog/GPX_OUT/ --year 2013-2021\n```\n\u003c/details\u003e\n\n### Strava\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eStrava\u003c/code\u003e GitHub poster\u003c/summary\u003e\n\n1. Sign in/Sign up [Strava](https://www.strava.com/) account\n2. Open after successful Signin [Strava Developers](http://developers.strava.com) -\u003e [Create \u0026 Manage Your App](https://strava.com/settings/api)\n\n3. Create `My API Application`: Enter the following information\n\n\u003cbr\u003e\n\n![My API Application](https://raw.githubusercontent.com/shaonianche/gallery/master/running_page/strava_settings_api.png)\nCreated successfully：\n\n\u003cbr\u003e\n\n![](https://raw.githubusercontent.com/shaonianche/gallery/master/running_page/created_successfully_1.png)\n\n4. Use the link below to request all permissions: Replace `${your_id}` in the link with `My API Application` `Client ID`\n```\nhttps://www.strava.com/oauth/authorize?client_id=${your_id}\u0026response_type=code\u0026redirect_uri=http://localhost/exchange_token\u0026approval_prompt=force\u0026scope=read_all,profile:read_all,activity:read_all,profile:write,activity:write\n```\n![get_all_permissions](https://raw.githubusercontent.com/shaonianche/gallery/master/running_page/get_all_permissions.png)\n\n5. Get the `code` value in the link\n\n\u003cbr\u003e\n\nexample：\n```\nhttp://localhost/exchange_token?state=\u0026code=1dab37edd9970971fb502c9efdd087f4f3471e6e\u0026scope=read,activity:write,activity:read_all,profile:write,profile:read_all,read_all\n```\n`code` value：\n```\n1dab37edd9970971fb502c9efdd087f4f3471e6\n```\n![get_code](https://raw.githubusercontent.com/shaonianche/gallery/master/running_page/get_code.png)\n\n6. Use `Client_id`、`Client_secret`、`Code` get `refresch_token`: Execute in `Terminal/iTerm`\n```\ncurl -X POST https://www.strava.com/oauth/token \\\n-F client_id=${Your Client ID} \\\n-F client_secret=${Your Client Secret} \\\n-F code=${Your Code} \\\n-F grant_type=authorization_code\n```\nexample：\n```\ncurl -X POST https://www.strava.com/oauth/token \\\n-F client_id=12345 \\\n-F client_secret=b21******d0bfb377998ed1ac3b0 \\\n-F code=d09******b58abface48003 \\\n-F grant_type=authorization_code\n```\n![get_refresch_token](https://raw.githubusercontent.com/shaonianche/gallery/master/running_page/get_refresch_token.png)\n\n```\npython3 -m github_poster --strava_client_id  ${client_id} --strava_client_secret ${client_secret} --strava_refresh_token ${refresh_token} --year 2012-2021\nor pip\ngithub_poster --strava_client_id  ${client_id} --strava_client_secret ${client_secret} --strava_refresh_token ${refresh_token} --year 2012-2021\n```\n\u003c/details\u003e\n\n### NS\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eNintendo Switch\u003c/code\u003e GitHub poster\u003c/summary\u003e\n\u003cbr\u003e\n\nFrom APP`(Nintendo Switch Parent Controls)` using `mitmproxy` to get the `session_token` and `devide _id`\n\n```\npython3 -m github_poster ns --ns_session_token ${session_token} --ns_device_id ${device_id} --year 2020-2021\nor pip\ngithub_poster ns --ns_session_token ${session_token} --ns_device_id ${device_id} --year 2020-2021\n```\n\u003c/details\u003e\n\n\n### Duolingo\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eDuolingo\u003c/code\u003e GitHub poster\u003c/summary\u003e\n\u003cbr\u003e\n\n1. login duolingo in broswer\n2. console `document.cookie.match(new RegExp('(^| )jwt_token=([^;]+)'))[0].slice(11)` get duolingo_jwt\n\nFind your `duolingo id`, F12 from `XHR`\n![image](https://user-images.githubusercontent.com/15976103/116336188-baad7000-a80a-11eb-80d7-033d4bf0f260.png)\n\n\n```\npython3 -m github_poster duolingo --duolingo_user_name ${duolingo_user_name}  --duolingo_jwt ${duolingo_jwt}  --year 2015-2021\nor\ngithub_poster duolingo --duolingo_user_name ${duolingo_user_name} --duolingo_jwt ${duolingo_jwt} --year 2015-2021\n```\n\u003c/details\u003e\n\n### Issue\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eIssue\u003c/code\u003e GitHub poster\u003c/summary\u003e\n\u003cbr\u003e\n\nLike my [issue](https://github.com/yihong0618/2021/issues/5)\n\n```\n\tpython3 -m github_poster issue --issue_number ${issue_number} --repo_name ${repo_name} --token ${github_token}\nor\ngithub_poster issue --issue_number ${issue_number} --repo_name ${repo_name} --token ${github_token}\n```\n\u003c/details\u003e\n\n### LeetCode\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eLeetCode\u003c/code\u003e GitHub poster\u003c/summary\u003e\n\u003cbr\u003e\n\nFind your `LeetCode Cookie`\n\n```\npython3 -m github_poster leetcode --leetcode_cookie ${leetcode_cookie} --year 2019-2021\nor\ngithub_poster leetcode --leetcode_cookie ${leetcode_cookie} --year 2019-2021\n```\n\n\u003c/details\u003e\n\n\n### Youtube\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eYouTube\u003c/code\u003e GitHub poster\u003c/summary\u003e\n\u003cbr\u003e\n\nUse Google [History Takeout](https://takeout.google.com/settings/takeout) to download `YouTube` history data，choose `json` format，mv `watch-history.json` to `IN-FOLDER` then run the code\n\n```\npython3 -m github_poster youtube --year 2015-2021\nor\ngithub_poster youtube --year 2015-2021\n```\n\u003c/details\u003e\n\n### Bilibili\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eBilibili\u003c/code\u003e GitHub poster\u003c/summary\u003e\n\u003cbr\u003e\n\nFind your `Bilibili (XHR) cookie`\n\n```\npython3 -m github_poster bilibili --cookie \"${bilibili-cookie}\"\nor\ngithub_poster bilibili --cookie \"${bilibili-cookie}\"\n```\n\u003c/details\u003e\n\n### GitHub\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eGitHub\u003c/code\u003e GitHub poster\u003c/summary\u003e\n\u003cbr\u003e\n\nGet your `GitHub Name` (in the url)\n\n```\npython3 -m github_poster github --github_user_name \"${github_user_name}\" --with-skyline\nor\ngithub_poster github --github_user_name \"${github_user_name}\" --with-skyline\n```\n\u003c/details\u003e\n\n### GitLab\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eGitLab\u003c/code\u003e GitLab poster\u003c/summary\u003e\n\u003cbr\u003e\n\nGet your `GitLab Name` (in the url)\n\n```\npython3 -m github_poster gitlab --gitlab_user_name \"${gitlab_user_name}\"\nor\ngithub_poster gitlab --gialab_user_name \"${gitlab_user_name}\"\n```\n\nFor self-managed `GitLab`, specify the base url of your instance. You should use `_gitlab_session` from Cookies if sign in required.\ns\n```\npython3 -m github_poster gitlab --gitlab_user_name \"${gitlab_user_name}\" --base_url \"https://your-gitlab.com\" --session \"${gitlab_session}\"\nor\ngithub_poster gitlab --gitlab_user_name \"${gitlab_user_name}\" --base_url \"https://your-gitlab.com\" --session \"${gitlab_session}\"\n```\n\n\u003c/details\u003e\n\n### Kindle\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eKindle\u003c/code\u003e GitHub poster\u003c/summary\u003e\n\u003cbr\u003e\n\nFind your [Amazon](https://www.amazon.com/) Cookie\n\n```\npython3 -m github_poster kindle --kindle_cookie ${kindle_cookie} --cn --year 2018-2021\nor\ngithub_poster kindle --kindle_cookie ${kindle_cookie} --cn --year 2018-2021\n```\n\n\u003c/details\u003e\n\n### WakaTime\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eWakaTime\u003c/code\u003e poster\u003c/summary\u003e\n\u003cbr\u003e\n\nFind your own `WakaTime API Key` at: [WakaTime API Key](https://wakatime.com/settings/api-key)\n\n```\npython -m github_poster wakatime --wakatime_key=\"your_wakatime_api_key\" --year 2019-2021\nor\ngithub_poster wakatime --wakatime_key=\"your_wakatime_api_key\" --year 2019-2021\n```\n\n\u003c/details\u003e\n\n### Dota2\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eDota2\u003c/code\u003e poster\u003c/summary\u003e\n\u003cbr\u003e\n\nFind your `dota2_id`, eg：Dendi's ID `70388657`\nCheck your dota2_id(steamid32): https://steamid.xyz/.\nCheck your game data: https://api.opendota.com/api/players/{dota2_id}/matches.\nmore info: https://docs.opendota.com/#section/Introduction\n\n\n```\npython -m github_poster dota2 --dota2_id=\"your dota2 id\" --year 2017-2018\nor\ngithub_poster dota2 --dota2_id=\"your dota2 id\" --year 2017-2018\n```\n\n\u003c/details\u003e\n\n### Nike\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003e Nike \u003c/code\u003e poster\u003c/summary\u003e\u003e\n\n**ALL need to do outside GFW**\n\n![example img](https://user-images.githubusercontent.com/67903793/282300381-4e7437d0-65a9-4eed-93d1-2b70e360215f.png)\n\n1. Login from this [website](https://unite.nike.com/s3/unite/mobile.html?androidSDKVersion=3.1.0\u0026corsoverride=https%3A%2F%2Funite.nike.com\u0026uxid=com.nike.sport.running.droid.3.8\u0026backendEnvironment=identity\u0026view=login\u0026clientId=VhAeafEGJ6G8e9DxRUz8iE50CZ9MiJMG), open F12 -\u003e XHR -\u003e get the `refresh_token` from login api.\n\n2. copy this `refresh_token` and use it in GitHub Secrets or in command line\n\n```\npython3 -m github_poster nike --nike_refresh_token=\"your nike_refresh_token\" --year 2012-2021\nor\ngithub_poster nike --nike_refresh_token=\"your nike_refresh_token\" --year 2012-2021\n```\n\n\u003c/details\u003e\n\n### Notion\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003e Notion \u003c/code\u003e poster\u003c/summary\u003e\n\nGet Notion `Internal Integration Token`(notion_token), see [here](https://developers.notion.com/docs/authorization#authorizing-internal-integrations) for more details.\n\n1. Sign in [Notion](https://www.notion.so/my-integrations) developers site\n2. Click 'New integration' to create a new token\n3. You can see `Internal Integration Token` below `Secrets` after submit\n\nGet Notion Database ID(database_id), see [here](https://developers.notion.com/docs/working-with-databases#adding-pages-to-a-database) for more details.\n\n1. Open the database as a full page in Notion\n2. Use the `Share` menu to `Copy link`, and you'll get a URL looks like `https://www.notion.so/{workspace_name}/{database_id}?v={view_id}`\n3. The part that corresponds to `{database_id}` is the ID of your Notion Database\n\nNote：The database need a property which type is `Date`, the value of it will be used to generate the poster.\nThe name of the date property should be set as option `prop_name`'s value，default value is `Datetime`\n\n```\npython3 -m github_poster notion --notion_token=\"your notion_token\" --database_id=\"your database_id\" --prop_name=\"your prop_name\"\nor\ngithub_poster notion --notion_token=\"your notion_token\" --database_id=\"your database_id\" --prop_name=\"your prop_name\"\n```\n\n\u003c/details\u003e\n\n### Garmin\n\u003cdetails\u003e\n\n\u003csummary\u003eMake your \u003ccode\u003e Garmin \u003c/code\u003e poster\u003c/summary\u003e\n\n需要填写 Garmin 的账号和密码\n\n```\npython3 -m github_poster garmin --garmin_user_name ${user_name} --garmin_password ${pass_word} --year 2016-2021 --special-color1 blue --special-color2 pink --me yihong0618 --cn\nor\ngithub_poster garmin --garmin_user_name ${user_name} --garmin_password ${pass_word} --year 2016-2021 --special-color1 blue --special-color2 pink --me yihong0618 --cn\n```\n\u003c/details\u003e\n\n### Forest\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003e Forest \u003c/code\u003e GitHub poster\u003c/summary\u003e\n\u003cbr\u003e\n\nNeed to add your Forest email and password\n\n```\npython3 -m github_poster forest --forest_email ${user_name} --forest_password ${pass_word} --year 2016-2021 --special-color1 blue --me yihong0618\nor\ngithub_poster forest --forest_email ${user_name} --forest_password ${pass_word} --year 2016-2021 --special-color1 blue --me yihong0618\n```\n\u003c/details\u003e\n\n### Json\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eJson(source data) types\u003c/code\u003e poster\u003c/summary\u003e\n\u003cbr\u003e\n\nmake sure your json file format is like `data.json` in examples\n\n```\npython3 -m github_poster json --json_file \"your json data file\" --year 2019-2021 --me PythonHunter\nor\ngithub_poster json --json_file \"your json data file\" --year 2019-2021 --me PythonHunter\n```\n\n\u003c/details\u003e\n\n### Multiple\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eMultiple types\u003c/code\u003e poster\u003c/summary\u003e\n\u003cbr\u003e\n\nsupport multiple types\n\n```\npython3 -m github_poster multiple  --types \"github, strava\"  --github_user_name \"github user name\" --strava_client_id  \"your strava client id\"  --strava_client_secret \"your strava client secret\"  --strava_refresh_token \"your strava refresh token\"  --year 2020-2021\nor\ngithub_poster multiple  --types \"github, strava\" --github_user_name \"github user name\" --strava_client_id  \"your strava client id\"  --strava_client_secret \"your strava client secret\"  --strava_refresh_token \"your strava refresh token\"  --year 2020-2021\n```\n\n\u003c/details\u003e\n\n### Summary\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eSummary types\u003c/code\u003e poster\u003c/summary\u003e\n\u003cbr\u003e\n\nsupport summary types\n\n```\npython3 -m github_poster summary  --types \"github, strava\"  --github_user_name \"github user name\" --strava_client_id  \"your strava client id\"  --strava_client_secret \"your strava client secret\"  --strava_refresh_token \"your strava refresh token\"  --year 2021\nor\ngithub_poster summary  --types \"github, strava\"  --github_user_name \"github user name\" --strava_client_id  \"your strava client id\"  --strava_client_secret \"your strava client secret\"  --strava_refresh_token \"your strava refresh token\"  --year 2021\n```\n\u003c/details\u003e\n\n### Jike\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eJike(source data) types\u003c/code\u003e poster\u003c/summary\u003e\n\u003cbr\u003e\n\nneed to find your Jike cookie from `Jike (XHR)` and `jike_user_id`, `jike_user_id` can be found in your personal page link\neg. in the link `https://web.okjike.com/u/82D23B32-CF36-4C59-AD6F-D05E3552CBF3`, `82D23B32-CF36-4C59-AD6F-D05E3552CBF3` is the user_id\n\nps. only get the data for the last year\n\n```\npython3 -m github_poster jike --jike_cookie \"your jike cookie\" --jike_user_id 'your jike user id' --year 2021 --me \"your name\" --with-animation --animation-time 14 --count_type 'like'\nor\ngithub_poster jike --jike_cookie \"your jike cookie\" --jike_user_id \"your jike user id\" --year 2021 --me \"your name\" --with-animation --animation-time 14 --count_type 'like'\n```\n\nOption argument `count_type`, you can specify statistics type:\n- `record`: post num (default)\n- `like`: post be liked num\n- `share`: post be share num\n- `comment`: post be comment num\n- `repost`: post be repost num\n\n\u003c/details\u003e\n\n### Todoist\n\n\u003cdetails\u003e\n\u003csummary\u003eMake \u003ccode\u003e Todoist Task Completion \u003c/code\u003e GitHub poster\u003c/summary\u003e\n\nBecause of Todoist policies, only users with Pro Plan(or above) can retrieve full historical activity from APIs.\n\nGet your token please find on [Todoist Developer Docs](https://developer.todoist.com/guides/#developing-with-todoist)\n\n\u003cbr\u003e\n\n```\npython3 -m github_poster todoist --year 2021-2022 --todoist_token \"your todoist dev token\" --me \"your name\"\nor\ngithub_poster todoist --year 2021-2022 --todoist_token \"your todoist dev token\" --me \"your name\"\n```\n\u003c/details\u003e\n\n### OpenLanguage\n\n\u003cdetails\u003e\n\u003csummary\u003eMake \u003ccode\u003e OpenLanguage \u003c/code\u003e GitHub poster\u003c/summary\u003e\n\nFor some reason, make sure your password only has letters and numbers, otherwise you will get an error.\n\u003cbr\u003e\n\n```\npython3 -m github_poster openlanguage --year 2021-2022 --openlanguage_user_name \"you account\" --openlanguage_password \"you password\" --me \"your name\"\nor\ngithub_poster openlanguage --year 2021-2022 --openlanguage_user_name \"you account\" --openlanguage_password \"you password\" --me \"your name\"\n```\n\u003c/details\u003e\n\n### AppleHealth\n\u003cdetails\u003e\n\u003csummary\u003eMake \u003ccode\u003e Apple Health \u003c/code\u003e GitHub poster\u003c/summary\u003e\n\nApple Health has plenty of data that can be visualized. \nAt this moment this loader only supports Move, Exercise, and Stand data from Apple Watch Activity but any record Apple Health has can be supported in the same way.\n\nLoader has two modes: \n\nincrement mode (default）is good for daily update. iOS Shortcut can be used to trigger a workflow running loader on this mode.\nRead [this repo](https://github.com/yihong0618/iBeats) for more details.\n\u003cbr\u003e\n```\npython3 -m github_poster apple_health --date \u003cdate-str\u003e --value \u003cvalue\u003e --apple_health_record_type \u003cmove, exercise, stand\u003e --me \"your name\"\nor\ngithub_poster apple_health --appple_health_date \u003cdate-str\u003e --apple_health_value \u003cvalue\u003e --apple_health_record_type \u003cmove, exercise, stand\u003e --me \"your name\"\n```\n\nbackfill mode is good for dumping all data at once.\nOpen the Health App, click on the avatar on the top right corner, select \"Export All Health Data\" on the bottom, copy the zip file to `IN-FOLDER` and unzip. You will get a `apple_health_export` folder. Then run:\n\u003cbr\u003e\n```\npython3 -m github_poster apple_health --apple_health_mode backfill --year 2015-2021 --apple_health_record_type \u003cmove, exercise, stand\u003e --me \"your name\"\nor\ngithub_poster apple_health --apple_health_mode backfill --year 2015-2021 --apple_health_record_type \u003cmove, exercise, stand\u003e --me \"your name\"\n```\n\u003c/details\u003e\n\n### ChatGPT\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003e ChatGPT \u003c/code\u003e GitHub poster\u003c/summary\u003e\n\u003cbr\u003e\n\nCopy the conversations.json from ChatGPT's official export history to `IN-FOLDER`, then run (renamed to chatgpt-history.json)\n\n```\npython3 -m github_poster chatgpt \nor\ngithub_poster chatgpt --me yihong0618\n```\n\u003c/details\u003e\n\n### NeoDB\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eNeoDB\u003c/code\u003e GitHub poster\u003c/summary\u003e\n\u003cbr\u003e\n\nUsing the API provided by NeoDB, we can easily make GitHub Poster with marks as data.\n\nAn access token is needed, which can be obtained from [NeoDB's developer page](https://neodb.social/developer).\n\nThere are to parameters for neodb module. `neodb_token`` is the token you get from [NeoDB's developer page](https://neodb.social/developer), `mark_type`` is the type of marks you want to import, which can be one of `complete`, `wishlist` and `progress`.\n\n```\npython3 -m github_poster neodb --neodb_token \u003ctoken\u003e --mark_type \u003ccomplete, wishlist, progress, all\u003e --me \"your name\"\n```\n\nMoreover, you can choose `all` as `mark_type` to import all marks.\n\n\u003c/details\u003e\n\n### AutoSleep\n\n\u003cdetails\u003e\n\u003csummary\u003eMake your \u003ccode\u003eAutoSleep\u003c/code\u003e Github poster\u003c/summary\u003e\n\u003cbr\u003e\n\nExport your `AutoSleep` data from app（eg. autosleep.csv）, then run\n\n```\npython3 -m github_poster autosleep --autosleep_file \"your csv file\" --me \"your name\"\nor\ngithub_poster autosleep --autosleep_file \"your csv file\" --me \"your name\"\n```\n\u003c/details\u003e\n\n# Contribution\n\n- Any Issues PR welcome.\n- Any new loader welcome\n- how to write new loader by `ruter`(Chinese) [如何为 GithubPoster 添加 loader](https://umm.js.org/p/c88bf4c7/)\n\nBefore submitting PR:\n- Format Python code with `black` (`black .`)\n- Format Python code with `isort` (`isort --profile black  **/**/*.py`)\n\n# TODO\n\n- [x] twitter\n- [x] GitLab\n- [x] GitHub\n- [x] LeetCode\n- [x] GitHub from issues\n- [x] YouTube\n- [x] Bilibili\n- [x] GitHub Actions\n- [x] Change all default color\n- [x] Skyline\n- [x] Dota2\n- [x] pypi\n- [x] test\n- [x] English README\n- [x] Loader doc\n- [ ] Refactor some code\n\n# GitHub Actions\n\n1. fork or clone this repo\n2. Change the secrets\n3. Change the `type` in `yml` file\n\n![image](https://user-images.githubusercontent.com/15976103/116517569-be6fee00-a901-11eb-9178-55df0c3301e3.png)\n![image](https://user-images.githubusercontent.com/15976103/116517636-d21b5480-a901-11eb-90e7-8314404f5f59.png)\n\n# Special thanks\n\n- @[flopp](https://github.com/flopp) great repo [GpxTrackPoster](https://github.com/flopp/GpxTrackPoster)\n- @[JasonkayZK](https://github.com/JasonkayZK) Wakatime loader\n- @[shaonianche](https://github.com/shaonianche) Dota2 loader\n- @[umm233](https://github.com/umm233) Jike loader\n- @[ruter](https://github.com/ruter) Notion loader\n- @[frostming](https://github.com/frostming) `CI` refator and some Actions code\n- @[j178](https://github.com/j178) refator the import logic\n- @[iamshaynez](https://github.com/iamshaynez) todolist loader\n- @[guaguaguaxia](https://github.com/guaguaguaxia) OpenLanguage loader\n- @[rip-tyang](https://github.com/rip-tyang) AppleHealth loader\n\n# Support\n\nThanks is enough.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyihong0618%2Fgithubposter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyihong0618%2Fgithubposter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyihong0618%2Fgithubposter/lists"}