Wir programmieren einen Bot

Um nun endlich mal vor ran zu kommen, starte Ich hier auf meinem Blog eine Neue Reihe.

Auch wenn ich kein begabter Schreiber bin kann ich trotz allem sehr begabt auf der Tastatur rumhacken.

Dies soll kein Tutorial darstellen und auch keine Anleitung zum Programmieren lernen.
Ich gehe pauschal davon aus das meine Leser ein fundiertes Grundwissen haben. Also ehr mehr wisst als ich? Ich bin gespannt. Challenge accepted! Muhahahah 😉

Okay fangen wir ganz einfach an. Ich arbeite hier mit Visual Studio 2013 da ich beschlossen habe das ganze in C# zu realisieren. Der Bot selbst soll uns im Spiel Ingress unterstützen. Also erstellen wir ein neues Projekt. Welche Art von Projekt man nimmt ist im Grunde wurscht.. ein Texteditor tut es auch! Da mir das aber zu stressig ist und ich nicht auf den Komfort einer IDE verzichten möchte wähle ich ein .. ähm .. WebProjekt. [ASP.net mit MVC]

WebProjekt? WTF?

Ein Bot im WebProjekt? Klar warum nicht?

Meine Wahl beruht auf zwei Überlegungen. Wie oft sitze ich am eigenen Rechner und wo kann ich Software installieren. Nicht oft und ehr weniger im Büro.

Also baue ich das ganze im Web und hoste es auch noch kostenlos bei Azure, also perfekt!

Zack 5 Mausklicks später, das Projekt steht. Na ja, zumindest der Grundrahmen… Einmal auf Azure veröffentlichen und schon ist es auf meiner Azure Webseite verfügbar.

Wie man sieht ist direkt eine „fertig“ Webseite online mit allem was man so braucht. Jetzt das tollste:

Wir implementieren die Google Auth Klamotten damit wir auch direkt mit unserem Spiele Account eingeloggt sind und den Token haben 🙂

Fangen wir mal an:

Öffne App_Start\Startup.Auth.cs

jetzt wird es kniffelig…

aus der letzten Zeile:

// app.UseGoogleAuthentication();

die Kommentar Slash [ // ] entfernen. Fertig.
Gut das war nun wirklich extrem komplex, dafür haben wir nun schon mal einen wichtigen Schritt erledigt. Der Token für die Ingress API steht uns nach dem Login zur Verfügung, cool. Dann testen wir mal den Google Login.  Klappt.

Nun benötigen wir eine Kommunikationsschnittstelle zu Ingress.
Also eine neue Klasse erstellen im neuen Ordner „Bot“ nennen wir sie mal… „IngressWebservice“ und lassen sie im Namespace Bot.

Was brauchen wir noch …
Ein Model für die Points ( Bot.Points)

Soll erstmal reichen da wir erstmal nur versuchen die Points von unserem aktuellem Standort abzurufen. Btw Standort, erstellen wir doch noch ne Klasse GPSControler.
Wir haben zwar im Webserver kein GPS Empfänger, wir wollen aber auch keine GPSDaten auslesen. Wir wollen unsere eigenen GPS Daten nutzen.

Wieder zurück im IngressWebservice:

erstmal ne public Points gePoints() { } Funktion um an die Punkt Daten zu kommen.
Mit dieser Funktion bauen wir erstmal die Kommunikation mit der Ingress API auf und  plaudern mit Ihr. Wie machen wir dass?

Als erstes müssen wir wissen wie die Ingress APP denn mit dem Server kommuniziert.
Das macht sie natürlich über ein Webservice und den findet man unter https://www.ingress.com/r/ also man findet ihn nicht wirklich hier, es kommt eine Weiterleitung und es gibt auch keine öffentliche Dokumentation zur API.. leider …
Aber wenn wir uns den APP Quellcode von Ingress anschauen können wir uns das alles ansehen. Anleitung zum Beispiel: hier

Am besten auch gleich Android Studio mit allem benötigten Zeug installieren.

Auslesen der punkte: /r/or74v5e0dijoseab
Irgendwas für den Chat: /r/tx9a36zfmalr5s35
Game Entinits: r/ivrsh7tuvj0if77k
Action Informationen r/tx9a36zfmalr5s35

Da es eine Rest API ist laufen alle informationen also über JSON \o/ das ist Spitze.

Das abrufen der Punkte würde dann in etwa so aussehen, dieser ganze unleserliche kram sind die geforderten Informationen. Bei meinem letzten Bot war das noch alles schön lesbar. Jetzt ist es verschlüsselt und sicher und keiner kann mehr die Api unberechtigt nutzen. So die Theorie.

{
„tnpkzqqu5p3mn4rp“:“or74v5e0dijoseab“,
„y76begpg0lz0g5s3″:“3aad79b9e7b135fa9c8b2c67bf6a051b0e0617f7“,
„l2pa0wslrtmthlhf“:64,
„s3xowgcoqduol0ij“:-90000000,
„cvv98kwi14wsfesr“:-180000000,
„as1getmlsyn7cyrg“:90000000,
„9xrrc4me7owrbazc“:180000000,
„kz90pcxjj0nypj0a“:0
}

für Portale dann ehr dass hier:

// Portal
{„cprnnhnm9s44iu39“:[„1_34055_21824″,“1_34056_21824″,“1_34055_21826″,“1_34056_21826″],“tnpkzqqu5p3mn4rp“:“ivrsh7tuvj0if77k“,“y76begpg0lz0g5s3″:“3aad79b9e7b135fa9c8b2c67bf6a051b0e0617f7″,“l2pa0wslrtmthlhf“:52,“s3xowgcoqduol0ij“:-90000000,“cvv98kwi14wsfesr“:-180000000,“as1getmlsyn7cyrg“:90000000,“9xrrc4me7owrbazc“:180000000}

Ingress sicher zu gestalten ist echt nicht einfach da der Code, in Java geschrieben wurde, einfach wieder „lesbar“ gemacht werden kann. Im Grunde OpenSource, am einfachsten ist es das ganze auch so zu handhaben und die „Community“ den Rest machen zu lassen 😉

Wie man sehen kann übergibt man die GEO Daten auch an die API, also brauchen wir uns diese auch nur zusammen schupsen und mitliefern.

Als nächstes müssen wir nur noch raus finden was von den Werten was sein soll…
Okay:

„s3xowgcoqduol0ij“:-90000000,
„cvv98kwi14wsfesr“:-180000000,
„as1getmlsyn7cyrg“:90000000,
„9xrrc4me7owrbazc“:180000000,

Das ist noch einfach. Hier haben wir GEO Daten im Grunde brauchen wir davon nichts aber um „sicher“ zu gehen liefern wir immer schön unsere Geo Position mit. Wir wollen ja nicht auffallen.

So dieser Beitrag ist erst mal lang genug.
Teil 2 wird folgen!

Ingress Update 1.30.2

Heute Morgen hab ich direkt mal das neue Update von Ingress gezogen.

Zu erst das Hacking:

Narf, wo ist die Liste hin? Man konnte so schöne Screenshots davon machen was man erhackt hat. 
Nun kommt irgendeine Animation was man schönes bekommt und eine Meldung die alles noch mal auflistet. 
Gut nun hat man unten die Meldung um ein ScreenShot zu machen aber schön ist was anders.

Rumschießen:

Sehr schön gelöst haben sie nun das Feuern. Nach dem man den ersten Burster gestartet hat bekommt man einen Fire Button und kann sein ganzes XM verfeuern.  Das gefällt mir sehr gut.

Portal Schlüssel:

Nun kann man Portal Schlüssel nach Entfernung oder nach Namen Sortieren. Sehr gut wenn man schnell sein Portal rechargen muss.

XM verbrauchende Buttons sind nun rot umrandet. Na wenn es Hilft.

Ingress Update 1.30.2

Heute Morgen hab ich direkt mal das neue Update von Ingress gezogen.

Zu erst das Hacking:

Narf, wo ist die Liste hin? Man konnte so schöne Screenshots davon machen was man erhackt hat. 
Nun kommt irgendeine Animation was man schönes bekommt und eine Meldung die alles noch mal auflistet. 
Gut nun hat man unten die Meldung um ein ScreenShot zu machen aber schön ist was anders.

Rumschießen:

Sehr schön gelöst haben sie nun das Feuern. Nach dem man den ersten Burster gestartet hat bekommt man einen Fire Button und kann sein ganzes XM verfeuern.  Das gefällt mir sehr gut.

Portal Schlüssel:

Nun kann man Portal Schlüssel nach Entfernung oder nach Namen Sortieren. Sehr gut wenn man schnell sein Portal rechargen muss.

XM verbrauchende Buttons sind nun rot umrandet. Na wenn es Hilft.

#Ingress 1.28.2 – Nun können Mods gehackt werden

Screenshot_2013-06-24-11-54-03[1]Nach dem letzten Update 1.28.2 können nun auch die neuen Mods gehackt werden.

Bei mir ist die Drop Rate ungefähr so hoch wie bei den Viren. Also sehr selten, sehr wenige..

Ich hab bis jetzt auch nur 4Link Amplifier bekommen.

2 Davon sind noch da.

Was machen diese Link Amp?

Link Amp´s vergrößern die Reichweite der Links so das auf eine Maximale Reichweite von 1883 KM gelinkt werden kann, was enorm zu den jetzigen 655 km ist.

  • Der erste  +2x range 
  • der zweite= +0.5x range
  • der dritte= +0.25x range
  • der vierte= +0.125x range

655 km * 2.875 = 1883 km

Ingress neue Mods mit Version 1.28

Ich spiele jetzt seit ca 8 Wochen Ingress, das ganze mehr oder weniger aktiv.

Mittlerweile habe ich auch bereits das Level 7 geknackt und bin Mitglied der Essener Ingress Community.

So nun zum Kern!

Nach dem die Schilde nun als Mods eingebunden sind und auch noch viel stärker sind als noch vor einer Woche kommen nun auch noch weitere Mods.

Dabei hab ich bis jetzt noch nicht mal einen der neuen Viren bekommen und trotzdem kommen weitere Spiel Items hinzu.

Die Unten gelisteten Informationen sind natürlich noch reine Spekulationen.
Aber wir werden sehen was dahinter steckt.

Man kann seine Portale mit den neuen Mods, wenn ich das richtig interpretiere, zu Farm Spots oder Defens Anlagen ausbauen.

Hier nun die im  Report veröffentlichten Mods:

Turret

Ingress-Mod-Turret

Dieser Mod erhöht die Anzahl der Portal Attacken.

Force

 

Ingress-Mod-Force-Amplifier

 

Ein Force Verstärker der den Schaden des Portals erhöht.

Heat sink

 

Ingress-Mod-Heat-Sink

 

Mit diesem Mod wird der Cooldown (aktuell 5 Minuten) verkürzt.
Ändert aber leider nichts am BurnOut nach dem vierten Hack.

Link Amp

 

 

Ingress-Mod-Link-Amplifier

Mit diesem Mod wird die Reichweite der Links erhöht.

Multi Hack

 

Ingress-Mod-Multi-Hack

 

Dieser Mod sorgt dafür das der BurnOut hochgesetzt wird.

 

Tutorial: Erstellung einer Google Map

Erstellung einer Google Map

Einleitung:
Für die Einbindung einer Google Map wird JavaScript, HTML und die Google Map API benötigt.
Da zum 01.03.2013 die Google Map API 2.0 offiziell abgeschaltet wird sollten nun auch die letzten auf die Google Map API 3.0 upgraden.

Für eine einfache Map Einbindung wird nur die Google Map API 3.0 benötigt diese kann direkt über die Goolge Server eingebunden werden.
Der entsprechende JavaScript Aufruf ist:

<script type=“text/javascript“ src=“https://maps.google.com/maps/api/js?sensor=false&amp;language=de“></script&gt;

Der Parameter language steht für die Sprache. In diesem Fall de für Deutsch. Der Parameter Sensor steht für eine aktive Ortungsprüfung. In diesem Fall false da keine Endnutzer Ortung gewünscht ist. Sollte dies der gewünscht werden, diesen Wert auf true setzten oder den Parameter entfernen. Im nächsten Schritt wird ein HTML DIV definiert der die erzeugte Map enthalten wird. Der entsprechende Eintrag im HTML Dokument ist beispielsweise:

<div class=“gmap“ id=“google_map“></div>

Nun benötigen wir die eigentliche erstellung unserer Google Karte. Hierzu schreiben wir uns eine JavaScript Anweisung und definieren die Google Map.

<script type=“text/javascript“>// <![CDATA[
/* zu erst werden die Optionen im JSON Format definiert */
var myOptions = {
zoom: 12, // Zoom Stufe der Karte
mapTypeId: google.maps.MapTypeId.ROADMAP // Ausgabe art der Karte ( Straßenkarte / Satellitenkarte / Terrain Karte / Hybrid )
};

/* anschließend wird das Eigentlich Karten Objekt erstellt*/
var myMap = new google.maps.Map(
document.getElementById(„google_map“), // Die ID des HTML DIV in dem die Karte gezeigt werden soll.
myOptions // die oben definierten Optionen. Diese könneten auch direkt hier übergeben werde.
);

// Die Position für New York wäre die folgende
var latlong = new google.maps.LatLng(40.7143528,-74.0059731);

/* nun muss noch das Zentrum der Karte auf die Position gesetzt werden */
myMap.setCenter(latlong);

// ]]></script>

Nun wird unser Div mit der Karte ersetzt.

Koordinaten können zum Beispiel über die unten genannte Webseite gefunden werden.
http://www.mapcoordinates.net/

Um nun auch noch einen sogenannten Marker auf die Karte zu setzten muss das JavaScript erweitert werden.

/* neuen Marker erstellen */
var Marker = new google.maps.Marker({
position: latlong, // Position des Markers ( hier New York das Zentrum der Karte )
map: myMap // die Karte zuweisen
});

Mit dieser Erweiterung ist ein Marker im Zentrum der Karte gesetzt. Das JavaScript sieht nun wie folgt aus:

<script type=“text/javascript“>// <![CDATA[
/* zu erst werden die Optionen im JSON Format definiert */
var myOptions = {
zoom: 12, // Zoom Stufe der Karte
mapTypeId: google.maps.MapTypeId.ROADMAP // Ausgabe art der Karte ( Straßenkarte / Satellitenkarte / Terrain Karte / Hybrid )
};

/* anschließend wird das Eigentlich Karten Objekt erstellt*/
var myMap = new google.maps.Map(
document.getElementById(„google_map“), // Die ID des HTML DIV in dem die Karte gezeigt werden soll.
myOptions // die oben definierten Optionen. Diese könneten auch direkt hier übergeben werde.
);

// Die Position für New York wäre die folgende
var latlong = new google.maps.LatLng(40.7143528,-74.0059731);

/* nun muss noch das Zentrum der Karte auf die Position gesetzt werden */
myMap.setCenter(latlong);

/* neuen Marker erstellen */
var Marker = new google.maps.Marker({
position: latlong, // Position des Markers ( hier New York das Zentrum der Karte )
map: myMap // die Karte zuweisen
});

// ]]></script>

Um mehrere Marker auf die Karte zu setzten werden einfach mehrere neue Marker mit Positionen untereinander geschrieben.

<script type=“text/javascript“>// <![CDATA[
/* zu erst werden die Optionen im JSON Format definiert */
var myOptions = {
zoom: 12, // Zoom Stufe der Karte
mapTypeId: google.maps.MapTypeId.ROADMAP // Ausgabeart der Karte ( Staßenkarte / Sattelitenkarte / Terrain Karte / Hybrid )
};

/* anschließend wird das Eigentlich Karten Objekt erstellt*/
var myMap = new google.maps.Map(
document.getElementById(„google_map“), // Die ID des HTML DIV in dem die Karte gezeigt werden soll.
myOptions // die oben definierten Optionen. Diese könneten auch direkt hier übergeben werde.
);

// Die Position für New York wäre die folgende
var latlong = new google.maps.LatLng(40.7143528,-74.0059731);

/* nun muss noch das Zentrum der Karte auf die Position gesetzt werden */
myMap.setCenter(latlong);

/* neuen Marker erstellen */
var Marker = new google.maps.Marker({
position: latlong, // Position des Markers ( hier New York das Zentrum der Karte )
map: myMap // die Karte zuweisen
});

// Die Position für den zweiten Marker erstellen
var latlong = new google.maps.LatLng(39.7143528,-75.0059731);

/* Einen weiterern Marker erstellen */
var Marker = new google.maps.Marker({
position: latlong, // Position des Markers ( hier New York das Zentrum der Karte )
map: myMap // die Karte zuweisen
});

// ]]></script>

Die Karte kann zudem bei mehreren Markern dem Zentrum dieser ausgerichtet werden.
Die erreicht man mit dem Google Map LatLngBouncer.

Anhand des Folgenden Beispiels wird eine Karte mit drei Markern Mittig positioniert.

<script type=“text/javascript“>// <![CDATA[
/* zu erst werden die Optionen im JSON Format definiert */
var myOptions = {
zoom: 12, // Zoom Stufe der Karte
mapTypeId: google.maps.MapTypeId.ROADMAP // Ausgabeart der Karte ( Staßenkarte / Sattelitenkarte / Terrain Karte / Hybrid )
};

/* anschließend wird das Eigentlich Karten Objekt erstellt*/
var myMap = new google.maps.Map(
document.getElementById(„google_map“), // Die ID des HTML DIV in dem die Karte gezeigt werden soll.
myOptions // die oben definierten Optionen. Diese könneten auch direkt hier übergeben werde.
);

/* Ein Bounce Objeket erstellen */
var Bounds = new google.maps.LatLngBounds(); // das Objekt zur verwaltung der Marker Positionen

// Die Position für New York wäre die folgende
var latlong = new google.maps.LatLng(40.7143528,-74.0059731);

/* dem Bounce die Position des ersten Markers übergeben */
Bounds.extend(latlong);

/* neuen Marker erstellen */
var Marker = new google.maps.Marker({
position: latlong, // Position des Markers ( hier New York das Zentrum der Karte )
map: myMap // die Karte zuweisen
});

// Die Position für den zweiten Marker erstellen
var latlong = new google.maps.LatLng(39.7143528,-75.0059731);

/* dem Bounce die Position des zweiten Markers übergeben */
Bounds.extend(latlong);

/* Einen weiterern Marker erstellen */
var Marker = new google.maps.Marker({
position: latlong, // Position des Markers ( hier New York das Zentrum der Karte )
map: myMap // die Karte zuweisen
});

// Die Position für den zweiten Marker erstellen
var latlong = new google.maps.LatLng(41.7143528,-73.0059731);

/* dem Bounce die Position des dritten Markers übergeben */
Bounds.extend(latlong);

/* Einen weiterern Marker erstellen */
var Marker = new google.maps.Marker({
position: latlong, // Position des Markers ( hier New York das Zentrum der Karte )
map: myMap // die Karte zuweisen
});

/* nun muss die Karte auf das Richtige Zoom Level gesetzt werden um alle Punkte sehen zu können. */
var zoomLevel = myMap.fitBounds(Bounds);

/* jetzt wird das Zentrum des Bounce Objektes benötigt. */
var mapCenter = Bounce.getCenter();

/* nun muss noch das Zentrum der Karte auf die Position gesetzt werden */
myMap.setCenter(mapCenter, zoomLevel);

// ]]></script>