Author

Topic: Suche SMS Gateway, welches sich mit Bitcoin aufladen lässt? (Read 256 times)

hero member
Activity: 784
Merit: 544
Anbei eine Methode, welche Bitcoinadressen live trackt OHNE dass man einen Fullnode mit Blockchain aufsetzen muss! Diese Methode beobachtet die Liste an unbestätigten Transaktionen. Wenn man nur daran interessiert ist Änderungen auf Adressen zu registrieren, dann ist das vollkommen ausreichend. Ein weiterer Vorteil: Die Änderung sind, sobald festgestellt, wahrscheinlich noch ein paar Minuten von der ersten Bestätigung entfernt.

Zu Beginn klone man folgendes Projekt

https://github.com/sebicas/bitcoin-sniffer

via

Code:
git clone https://github.com/sebicas/bitcoin-sniffer.git

Dann

Code:
cd bitcoin-sniffer

Jetzt muss man ein paar kleine Änderungen im Code vornehmen

Code:
nano sniffer.py -c

Zeile 26 ändere man zu

Code:
MY_VERSION = 31800

In Zeile 31 trage man eine IP eines laufenden Fullnodes ein, entsprechende IP-Adressen gibt es hier

https://bitnodes.earn.com/nodes/?q=Germany

Dann kann man Änderungen auf Adressen wie folgt live beobachten

Code:
@:~/Downloads/bitcoin-sniffer$ ./sniffer.py | grep --line-buffered 1NDyJtNTjmwk5xPNhjgAMu4HDHigtobu1s
     To: 1NDyJtNTjmwk5xPNhjgAMu4HDHigtobu1s BTC: 2.65915878
     To: 1NDyJtNTjmwk5xPNhjgAMu4HDHigtobu1s BTC: 4.77593269
     To: 1NDyJtNTjmwk5xPNhjgAMu4HDHigtobu1s BTC: 1.03436037
     ...

Die Adresse ist die aktuelle Wallet von Binance, siehe auch

https://bitinfocharts.com/de/top-100-richest-bitcoin-addresses.html

Dort passiert nämlich ständig was.

Natürlich muss man auch Sorge tragen, dass man durchgehend mit einem laufenden Fullnode verbunden ist. Man muss sich also noch ein Skript stricken, welches aus der Liste von vorhandenen Fullnodes einen auswählt, der online ist. Und wenn dieser Knoten nicht mehr erreichbar ist, dann muss das Skipt den Knoten wechseln. Das überlasse ich aber jedem selbst.
hero member
Activity: 784
Merit: 544
So, habe den Code noch etwas umgestrickt. Folgende Änderung: Man möchte ja nicht nur wissen ob was auf den Adressen passiert, sondern auch, ob die entsprechenden Blockexplorer funktionieren und wie sich die Balance geändert hat.

Die Balanceberechnung läuft nun über ein R-Skript (sum_balances.R), welches auch (mehr oder weniger gut) testet ob die Tabelle mit den Balances sauber aus den Explorern ausgelesen wurden. Für das R-Skript muss R installiert sein. Das geht aber leicht über:

Code:
sudo apt-get install r-base

Das R-Skript:

Code:
#!/usr/bin/env Rscript

# which files are to be compared
args <- commandArgs(TRUE);

# if data is not formatted correctly, we want a corresponding message
tryCatch(
   {
      old <- read.table(file=args[1], sep="\t", quote="");
      new <- read.table(file=args[2], sep="\t", quote="");
   },
   error=function(cond){
      cat("error reading files\n");
      q();
   },
   warning=function(cond){
      cat("warning reading files\n");
      q();
   },
   finally={
   }
)

# give the data frames column names
colnames(old) <- c("ADDRESS", "AMOUNT", "CURRENCY");
colnames(new) <- c("ADDRESS", "AMOUNT", "CURRENCY");

# amounts to numbers since we do not want factors
old[,"AMOUNT"] <- as.numeric(as.character(old[,"AMOUNT"]));
new[,"AMOUNT"] <- as.numeric(as.character(new[,"AMOUNT"]));

# test if all blockchain explorers responded
cold <- unique(old[,"CURRENCY"]);
cnew <- unique(new[,"CURRENCY"]);
if (length(cold) == length(cnew)){
   cat("");
} else {
   cat("currency missing, corresponding explorer might be down\n");
}

# get maximal number of currencies available in the files
currencies <- cold;
if (length(cnew) > length(cold))
   currencies <- cnew;

v <- c(); # vector of deltas
for (currency in currencies){
   # if all blockchain explorers worked (might still fail because explorer
   # can be unresponsive for some addresses in case of much traffic)
   if (currency %in% cold && currency %in% cnew){
      aold <- sum(old[old[,"CURRENCY"]==currency,"AMOUNT"]);
      anew <- sum(new[new[,"CURRENCY"]==currency,"AMOUNT"]);
      v <- c(v, anew - aold);
   }
   # if explorer failed for currency in new file
   if (currency %in% cold && !(currency %in% cnew)){
      aold <- sum(old[old[,"CURRENCY"]==currency,"AMOUNT"]);
      v <- c(v, 0 - aold);
   }
   # if explorer failed for currency in old file
   if (!(currency %in% cold) && currency %in% cnew){
      anew <- sum(new[new[,"CURRENCY"]==currency,"AMOUNT"]);
      v <- c(v, anew - 0);
   }
}

# test if deltas sum up to zero
if (sum(v) == 0){
   cat("ok\n");
} else {
   cat(paste(c(v, "\n"), collapse=" "));
}

Natürlich wieder ausführbar machen. Ich kann aber nicht garantieren, dass bei fehlerhaftem Auslesen der blockchains die Fehler auch sauber und wie geplant abgefangen werden. If-Abfragen könnten eleganer gelöst werden ...

Das Skript check_balances.sh muss auch angepasst werden:

Code:
#!/bin/bash
date=$(date);
epoch=$(date +%s);

path="/home/user/balances";

$path/balances.sh > $path/balances.$epoch.txt

old=$(find $path -name "balances.*.txt" | uniq | sort | tail -n2 | head -n1);
new=$(find $path -name "balances.*.txt" | uniq | sort | tail -n1);

echo "comparing $old with $new";

hold=$(md5sum $old | cut -d " " -f 1);
hnew=$(md5sum $new | cut -d " " -f 1);

echo "comparing $hold with $hnew";

# this is necessary for R producing no locale warnings, but might differ from OS to OS
LC_TIME=C;
LC_MONETARY=C;
LC_PAPER=C;
LC_MEASUREMENT=C;

out=$($path/sum_balances.R $old $new);
info="0";

if [[ "$out" == "ok" ]]
then
   sleep 0;
   #info=$(wget -qO- "http://api.lima-city.de/sms?user_id=&apikey=&text=&number=");
else
   sleep 0;
   # to make sure, that we get a message only once
   if [[ "hold" != "hnew" ]]
   then
      out="$date: $out";
      info=$(wget -qO- "http://api.lima-city.de/sms?user_id=&apikey=&text=$out&number=");
   fi
fi

echo "$out"
echo "$info"

Wenn alles funktionert bekommt man eine SMS der Form:

Code:
Sat May  5 15:02:28 CEST 2018: 0 0 0 0 0 0 100

Wobei Coin #7 100 Einheiten gut gemacht hat, alle anderen blieben gleich.
hero member
Activity: 784
Merit: 544
Weiss jemand zufällig, wie man wget auf Android zum Laufen bekommt?

Das Problem ist, dass wget auf (meinem) Android ein Teil von busybox ist. Und diese Variante kann kein https. Deshalb habe ich auf:

https://busybox.net/

Nach einer Variante für die arm-CPU gesucht:

https://busybox.net/downloads/binaries/

Und habe dort:

https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/

Dann alle arm-Versionen ausprobiert. Leider bekomme ich bei jedem Aufruf eine Fehlermeldung. Die Version für x86_64 funktioniert aber auf einem normalen Laptop wie gewollt. Weiss jemand, wo das Problem sitzt? (Hoffentlich nicht vor dem Bildschirm ...)
hero member
Activity: 784
Merit: 544
Anbei die Skripte. Als Beispiel nutze ich Litecoin. Der Coin ist aber leicht anpassbar.

Der Pfad wo alles liegt ist:

Code:
/home/user/balances

Wir beginnen mit einer Datei (ltc_addresses.txt), welche Adressen von Interesse enthält:

Code:
LTU2cds4aSdXFip9sV4gXphnhxGQjgfjmg
LQL9pVH1LsMfKwt82Y2wGhNGkrjF8vwUst
LPpHectVSbk7YHa5X89Cm3FoFBfzkJBJc9
LRcYfbDMhwvXaGPFccaKuc3fZD1Nb55aGn
LY5fxZS74Ewuj1TTHwat23eUmZwimsksrU
Laub752qu81oWwkNKEyawyKruUC6cEyD2x
LbHBMZTQBq7aM5WS5TeKYJWH8pxeaLoRXe
LPpVeFSKvH593CChqP9qpV5toEXntekjiF
LZYCpYnV8VE4X7TbH8jjuvYPMfAugGLNAs
LfmG6qepmucU2aQaVJK4EJgBzQHeGz5ML4

Dabei sollte es egal sein wie die Adressen in der Datei vorliegen, aber am Besten ist es wohl, wenn in jeder Zeile eine gelistet ist.

Desweiteren erzeugen wir ein Skript (ltc_balances.sh), welches sich die entsprechenden Balances von bitinfocharts zieht:

Code:
#!/bin/bash
addresses=$(cat ltc_addresses.txt | grep -E -o "L[a-zA-Z0-9]{10,40}");

while read -r address;
do
   info=$(wget -qO- https://bitinfocharts.com/litecoin/address/$address --user-agent="Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0");
   balance=$(echo "$info" | grep "Balance" | grep -Eo "Balance.*[0-9]+([.][0-9]+)*.+LTC" | grep -Eo "[,0-9]+([.][0-9]+)*" | head -1 | sed "s/,//g");

   if [[ "$balance" == "" ]]; then
      balance="0";
   fi

   echo -e "$address\t$balance\tLTC";
done <<< "$addresses"

Das Ganze muss natürlich ausführbar sein und deshalb:

Code:
chmod 755 ltc_balances.sh

Ausführen des Skripts:

Code:
./ltc_balances.sh

Führt zu folgender Ausgabe:

Code:
LTU2cds4aSdXFip9sV4gXphnhxGQjgfjmg 1086671.28 LTC
LQL9pVH1LsMfKwt82Y2wGhNGkrjF8vwUst 897135.39 LTC
LPpHectVSbk7YHa5X89Cm3FoFBfzkJBJc9 897070.97 LTC
LRcYfbDMhwvXaGPFccaKuc3fZD1Nb55aGn 895520.96 LTC
LY5fxZS74Ewuj1TTHwat23eUmZwimsksrU 773647.37 LTC
Laub752qu81oWwkNKEyawyKruUC6cEyD2x 768207.51 LTC
LbHBMZTQBq7aM5WS5TeKYJWH8pxeaLoRXe 762497.23 LTC
LPpVeFSKvH593CChqP9qpV5toEXntekjiF 704140.10 LTC
LZYCpYnV8VE4X7TbH8jjuvYPMfAugGLNAs 700000.00 LTC
LfmG6qepmucU2aQaVJK4EJgBzQHeGz5ML4 694655.63 LTC

Zusätzlich erzeugen wir uns ein Metaskript (balances.sh), welches Oberes für verschiedenste Coins ausführt, im Beispiel natürlich nur für Litecoin:

Code:
#!/bin/bash
path="/home/user/balances"
cd $path
echo "# LTC"
./ltc_balances.sh

Die Datei muss wieder ausführbar gemacht werden.

Jetzt benötigen wir noch ein Metametaskript (check_balances.sh), welches den alten und neuen Zustand der Balances vergleicht:

Code:
#!/bin/bash
epoch=$(date +%s);

path="/home/user/balances";

$path/balances.sh > $path/balances.$epoch.txt

old=$(find $path -name "balances.*.txt" | uniq | sort | tail -n2 | head -n1);
new=$(find $path -name "balances.*.txt" | uniq | sort | tail -n1);

echo "comparing $old with $new";

hold=$(md5sum $old | cut -d " " -f 1);
hnew=$(md5sum $new | cut -d " " -f 1);

echo "comparing $hold with $hnew";

info="0";

if [[ $hold == $hnew ]]
then
   #info=$(wget -qO- "http://api.lima-city.de/sms?user_id=&apikey=&text=&number=");
   echo "ok"
else
   #info=$(wget -qO- "http://api.lima-city.de/sms?user_id=&apikey=&text=&number=");
   echo "data differs";
fi

echo "$info"

Die Werte für , , , und müsst ihr entsprechend anpassen. In oberem Skript ist der wget-Aufruf auskommentiert, welcher die SMS erzeugt. Das müsst ihr also auch anpassen. Auch dieses Skript muss wieder ausführbar gemacht werden.

Der letzte Schritt besteht darin, einen cronjob zu installieren, welcher check_balances.sh regelmässig aufruft:

Code:
crontab -e

Und dann folgende Zeile einfügen:

Code:
0 12 * * * /home/user/balances/check_balances.sh >> /home/user/balances/balances.out

Oberer Cronjob testet einmal täglich die gegebenen Adressen um 12 Uhr mittags. Nun wird, abhängig vom einkommentierten wget-Aufruf in check_balances.sh, eine SMS verschickt, mit dem entsprechenden Text. Die Datei balances.out enthält Output von check_balances.sh zum Entkäfern falls mal etwas nicht funktionieren sollte.

Die ganze Geschichte funktioniert natürlich nur, wenn auch bitinfocharts funktioniert. Sollten die etwas an ihrer Ausgabe ändern, so ist der reguläre Ausdruck in ltc_balances.sh natürlich Makulatur. Desweiteren braucht ihr einen Server, der ständig bzw. um 12:00 mittags rum online ist. Dafür bietet sich ein Himbeerkuchen an.

Ihr könnt natürlich die Parameter variieren wie ihr lustig seid. Kommt immer auf die Ausprägung der eigenen Paranoia an.  Wink
hero member
Activity: 784
Merit: 544
Sodelle, die API ist auch easy peasy. Der http-Link im php-Krimskrams kann direkt in die Browseradressleiste kopiert werden, die entsprechenden Variablen mit den richtigen Werten ausgetauscht und schwupps kann man sich selbst SMS schicken. Geht dann natürlich auch per wget, vorausgesetzt man hat irgendwo einen Server laufen, welcher die SMS erzeugt.

Ein bisschen doof ist, dass der SMS-Aufruf über http läuft und NICHT über https. D.h. die ganzen wichtigen Metainfos, wie User-ID und "Passwort" werden unverschlüsselt verschickt sodass jemand, der sich dazwischen klemmt und den Aufruf abfängt, dann die gesamten SMS nutzen kann.

Ich muss meine Skriptsammlung nun noch in Ordnung bringen, dann poste ich den Kram. Ist vielleicht für den ein oder anderen ganz interessant.
hero member
Activity: 784
Merit: 544
Scheinbar spielt bitpay nicht mehr mit der Schildbach'schen Smartphone-App zusammen und leider auch nicht mit Coinomi. Das muss mit irgendwelchen Metainformationen im QR-Code zusammenhängen.

Mit Mycelium scheint es aber zu funktionieren.
hero member
Activity: 784
Merit: 544
Hmm ... habe lima-city.de ausprobiert, ich kann aber nichts mit Bitcoin bezahlen.

Der Dienstleister nutzt scheinbar bitpay aber die Schildbach'sche Android-App oder Coinomi verweigern das Einlesen des bitpay-QR-Codes.

Weiss jemand warum das nicht funktioniert? Und kennt jemand eine Alternative?
hero member
Activity: 784
Merit: 544
Dank an euch beide. Werde das nächste Woche mal auschecken. Den Code gibt es dann noch oben drauf.
hero member
Activity: 721
Merit: 592
Lässt sich ein entsprechendes php-Skript auf der Kommandozeile ausführen?

Nur, wenn auf dem Rechner auch PHP läuft.

Möglicherweise brauchst du aber nicht zwingend PHP um die Daten zur API zu schicken.
hero member
Activity: 784
Merit: 544
Sieht auf den ersten Blick nicht schlecht aus:

https://www.lima-city.de/hilfe/sms-kontingente

Danke.

Mit php kenn ich mich jetzt gar nicht aus. Lässt sich ein entsprechendes php-Skript auf der Kommandozeile ausführen? Also unabhängig von einem Webserver und dem ganzen html Kram?
legendary
Activity: 1582
Merit: 1031
bei lima-city kannst du mit Bitcoin bezahlen und die bieten auch SMS versand an !
Die bieten ein api an damit kannst du dann mit php sms versenden is ganz cool.

https://www.lima-city.de/hilfe/sms-kontingente



mfg
hero member
Activity: 784
Merit: 544
Kennt da jemand ein weltweit funktionierendes bzw. benutzt jemand eins aktiv und kann das empfehlen? Wenn man googelt bekommt man nämlich eine recht grosse Auswahl ...  Huh
Jump to: