Massen-Editierung von eigenen GitHub Issues

Wie hier beschrieben wurde mein GitHub Account verwendet um Spam-Crypto-Issues anzulegen. GitHub hat meinen Account nach Klärung des Sachverhalts wieder freigeschalten, er wurde aber shadowbanned, damit niemand die Spam-Issues sieht.

Ich sollte die Issues selbst unschädlich machen, weil sie dafür keine Kapazität haben. Konkret bedeutet das, die Issues zu editieren, denn löschen kann man sie nicht (Nur wenn man Admin der Repos ist).

Die erste Schwierigkeit war, überhaupt eine Auflistung meiner Issues zu bekommen. Denn der Shadowban ging so weit, dass ich auf der Seite https://github.com/issues nichts angezeigt bekam. Selbst per REST API oder globaler Suche wurden mir meine Issues nicht angezeigt.

Zum Glück habe ich zufällig gesehen, dass die Issues auf https://github.com/notifications/subscriptions angezeigt werden, denn für jede dieser Issues wurde automatisch eine Subscription angelegt.

Der GitHub Support empfahl mir, per REST API die Issues zu bearbeiten. Doch das ging nicht mit einem einfachen Access Token, weil der PATCH /repos/{owner}/{repo}/issues/{issue_number} Endpoint nur per GitHub App zugänglich ist. Eine solche zu erstellen ist aber aufwändig.

Was aber funktioniert hat, um die Issues automatisch zu bearbeiten, war die GitHub CLI.

Ich habe also erstmal per Tampermonkey ein Skript geschrieben um per jQuery die URLs der Issues aus https://github.com/notifications/subscriptions zu extrahieren:

// ==UserScript==
// @name         New Userscript
// @namespace    http://tampermonkey.net/
// @version      2023-12-18
// @description  try to take over the world!
// @author       You
// @match        https://github.com/notifications/subscriptions*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=github.com
// @grant        none
// @require      http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
// ==/UserScript==

(function() {
    'use strict';

    var a = ""
    $(".Link--primary.v-align-middle.no-underline.h4").each(function(){a = a + $(this).attr("href") + "\n"})
    console.log(a);
})();

Etwas nervig, weil auf der Seite nur 25 Subscriptions auf einmal angezeigt werden.

Dann habe ich ein Python Skript geschrieben um die GitHub CLI automatisch aufzurufen:

import subprocess

urls = """https://github.com/jieyilong/tree-of-thought-puzzle-solver/issues/4
https://github.com/insipx/environments/issues/3
https://github.com/Thajuiceman69/supreme-umbrella/issues/3
https://github.com/jwcastillo/0_to_100_k6/issues/4
https://github.com/PeterPorzuczek/placetip/issues/6
https://github.com/KenMan79/-chainlink-hardhat-starter-kit/issues/18
https://github.com/Hrishikesh156/Anti-Cheating-System-using-RFID/issues/1
https://github.com/wpank/Cameratia/issues/9
https://github.com/davidbonnaud/flixter/issues/28
https://github.com/lucxsdev/blockland/issues/2
https://github.com/Lerog1724/pancake-frontend/issues/2
https://github.com/the-sisyphus/scaffold/issues/1
https://github.com/K7TRY/WordFrequencyLists/issues/1
https://github.com/imanshirani/3DsMax_SCRIPT/issues/1
https://github.com/leometzger/aws-labs/issues/1
https://github.com/shprink/angularjs-browserify-polymer-boilerplate/issues/1
https://github.com/0xmic/bonding-curve-token/issues/1
https://github.com/jpaulet/dArray/issues/14
https://github.com/BenWhiteJam/braindumps/issues/5
https://github.com/moskalyk/aqua-evm-router/issues/4"""

urls = urls.split("\n")
for url in urls:
    num = url.split("/")[6]
    user = url.split("/")[3]
    repo = url.split("/")[4]
    try:
        subprocess.check_output('gh issue close ' + num + ' -R ' + user + '/' + repo + ' --reason "not planned"', shell=True)
    except:
        pass
    try:
        subprocess.check_output('gh issue edit ' + num + ' -R ' + user + '/' + repo + ' --title "Issue can be deleted" --body "I edited this issue to remove cryptocurrency adspam. My account was used by a bad actor because of a leaked access token. This bad actor created lots of issues with cryptocurrency adspam. I am sorry. Sadly I can only update issues, not delete them."', shell=True)
    except:
        pass

Nur bei 2 Issues hat das nicht funktioniert, weil das Repo auf readonly gestellt wurde…

Dann habe ich den Support angeschrieben, um den Shadowban entfernt zu bekommen.