Instagram Java API

FrazeColder

Lt. Commander
Registriert
Okt. 2013
Beiträge
1.721
Hey Community,

Es gibt bei GitHub eine Java Libary für die Instagram API: https://github.com/sachin-handiekar/jInstagram
Ich würde gern mir ein kleines Tool programmieren, mit dem Ich sehen kann, wem Ich folge und dann manchen Personen entfolgen oder folgen kann.

Leider finde Ich dazu nichts. Seht ihr da was und kann man überhaupt über die API Leuten folgen und entfolgen?

MfG und Danke!
 
Ah okay, cool. Vielen Dank!
Eine Frage bleibt mir aber noch.

Wie genau funktioniert das bei Instagram. So wie Ich das bisher verstanden habe, muss Ich eine "App" auf Instagram anmelden, um eine Token und AppSecret zu bekommen. Und dann kann Ich mit diesen Daten eine Verbindung herstellen, oder?
 
Gut, Vielen Dank :)
Doch eins bleibt doch noch hehe

Was genau ist die .callBack("String) Funktion?
Code:
InstagramService service = new InstagramAuthService()
                            .apiKey("your_client_id")
                            .apiSecret("your_client_secret")
                            .callback("your_callback_url")     
                            .build();

Ich will die "App" nur lokal für mich alleine Nutzen und nicht für mehrere User. Ich will dafür keinen Server bzw. URL mieten...
http://stackoverflow.com/questions/...n-instagram-api-and-how-to-can-i-implement-it
Ergänzung ()

Ich glaube, mir bleibt sogar noch Fragen offen.
Wieso muss Ich der Methode getAuthorizationUrl() etwas übergeben?

Zu finden unter Validate your user against Instagram.
Und bei Getting the Access Token muss Ich auch was übergeben...

"new Verifier("verifier you get from the user");" Was muss Ich da eingeben?
 
Zuletzt bearbeitet:
Naja du durchläufst da halt einen normalen oAuth-Flow.

1) Du meldest eine App an
2) Du bekommst client_id/client_secret
3) Ein User klickt in deiner App auf: erlaube "deine App" auf bspw. meine Fotos zuzugreifen.
4) Der User wird auf Instagram geschickt.
5) Der User meldet sich mit seinen Zugangsdaten auf Instagram an
6) Der User wird auf eine URL auf deinen Server weitergeleitet, an diese URL wird ein &token=TOKEN angehängt
7) Du liest den Token aus
8) Du speicherst den Token
9) Du signalisierst dem User, dass er "deine App" erfolgreich authorisiert hat
10) Du kannst mit dem Token im Namen deines Nutzers Aktionen durchführen, bspw. ein neues Foto posten.

Dafür brauchst du URLs wie redirect, callback etc.

Der Verifier dient wohl dazu, dass du deine Calls hashen kannst um zu überprüfen ob sie unverändert ausgeführt werden.

(Ich habe mir weder diese Java Lib noch die Instagram Api angeguckt nur kurz beschrieben wie das bei Facebook und vielen anderen Diensten funktioniert und hier kann ich mir nicht vorstellen, dass sich instagram unterscheidet)
 
Zuletzt bearbeitet:
Ich habe jetzt meine Client ID, mein Client Secret und sogar meinen AccessToken, ohne meine Callback URL.
Ich will das ja nur privat nutzen, für mich!

Aber Ich komme trotzdem nicht weiter... :/
 
Ich habe bemerkt, dass einige Sachen darin veraltet sind. dass alles ist hiermit realisierbar:

Instagram instagram = new Instagram("String AccessToken", "String ClientID");

Aber Ich kann trotzdem nicht so gut die "jInstagram Usage" verstehen. Ist es irgendwie möglich, sich z.B. 50 Bilder mit einem Tag ausgeben zu lassen?
Ergänzung ()

Wenn Ich jetzt jemandem Folgen will, bekomme Ich diesen Error...

Code:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" org.jinstagram.exceptions.InstagramBadRequestException: APINotFoundError: this user does not exist
	at org.jinstagram.entity.common.InstagramErrorResponse.throwException(InstagramErrorResponse.java:45)
	at org.jinstagram.Instagram.handleInstagramError(Instagram.java:1160)
	at org.jinstagram.Instagram.createInstagramObject(Instagram.java:1123)
	at org.jinstagram.Instagram.setUserRelationship(Instagram.java:602)
	at Follower.YG_Moto.main(YG_Moto.java:34)
 
Zuletzt bearbeitet:
Ok ich habe gerade mal kurz ne Mini App mit http://mikefowler.me/instajam/ gebaut. Mit dieser wollte ich mir nur meine eigenen Follower ausgeben lassen. Gut ich hatte noch keinen Instagram Account also einen angelegt und ein paar Leute geadded.

Eine Instagram App erstellt, Client_Id besorgt etc. dann war ich sehr erstaunt, dass ich meine "wem folge ich Liste" immer leer ist obwohl ich ein paar Leuten folge.

Danach gegoogled und folgendes gefunden: http://stackoverflow.com/questions/...ith-a-correct-access-token-from-instagram-api

Also habe ich mir noch einen Account angelegt und diesen in meine Sandbox eingeladen und auf Instagram geadded und Zack wurde mir dieser User angezeigt.

Also musst du evtl. deine App Live schalten, dass solche Sachen gehen. Kein Plan wie Umfangreich die Prüfung bei Instagram für Live Apps aussieht, von Paypal weis ich aber, dass du dann wirklich eine URL etc. benötigst.
 
Wie genau meinst du das?
Du hast das doch auch mit ner Sandbox hinbekommen. Also muss Ich das doch auch für meinen privat Gebrauch hinbekommen?

Meinst du, Ich soll mir einfach einen Emulator runterladen und Instagram darauf laufen lassen?
 
FrazeColder schrieb:
Aber Ich kann trotzdem nicht so gut die "jInstagram Usage" verstehen. Ist es irgendwie möglich, sich z.B. 50 Bilder mit einem Tag ausgeben zu lassen?

Im Sandbox Mode bestehen einige Restriktionen. Maximal 20 Bilder sind möglich - aber nur von Sandbox Usern.


FrazeColder schrieb:
Wenn Ich jetzt jemandem Folgen will, bekomme Ich diesen Error...

Code:
Exception in thread "main" org.jinstagram.exceptions.InstagramBadRequestException: APINotFoundError: this user does not exist


Ist auf deren Seiten doch schön erklärt. Du kannst nicht irgendeinem User einfach folgen.

https://www.instagram.com/developer/sandbox/#sandbox-users
 
Evtl. habe ich mich unklar ausgedrückt, soares hat es ja nochmal aufgegriffen. In der Sandbox bist du auf User in deiner Sandbox limitiert.

Als Beispiel:

- du folgst 300 Leuten
- du lädst 2 in deine Sandbox ein
- diese beiden MÜSSEN bestätigen, dass sie Teil deiner Sandbox sind
- du führst den Api Call zur Anzeige deiner Follower-Liste aus
- du bekommst als Ergebnis nicht 300 angezeigt sondern lediglich die beiden Sandbox-User

Daneben hat die Sandbox auch noch Restriktionen, so kannst du z.B. nur 5 User in deine Sandbox einladen...

Daher würde ich sagen, dass die Sandbox App für dich absolut keinen Sinn macht, auch wenn du das nur für dich privat machen willst. Ich bin gestern auch genau auf das gleiche Problem gestoßen, dass ich dir gerade beschrieben habe. Daher hat es nur geklappt einen kleinen Teil meiner Abonnements anzuzeigen, nämlich meinen Sandbox User und nicht alle denen ich folge.
 
Ich habe es auch zu anfang über die offizielle API versucht, wie Du. Bis ich dann auch eben auf die Limitierungen der Daten-/Aktionen gestoßen bin.

Ein kleiner Tipp am Rande: Versuche die Daten, welche über SSL gesendet werden, auszulesen. Damit bin ich auch zu meinem Ziel gekommen und habe mir daraus eine kleine Anwendung gebastelt, die das bewerkstelligt, was Du vorhast. ;)
 
Wie kann Ich das ganze den per SSL machen?
Wäre ganz nett von dir, wenn du mir da weiter helfen würdest :)
 
Mit Hilfe von Jsoup sollte es kein Problem sein.

Versuch mal folgenden Code:
Code:
// https://www.computerbase.de/forum/threads/instagram-java-api.1568143/

import java.util.Map;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.jsoup.Connection;


public class IGLogin
{
	private static final String USER_AGENT= "Mozilla/5.0";
	//private static final String USER_AGENT= "Mozilla/5.0 (Windows NT 6.1; rv:45.0) Gecko/20100101 Firefox/45.0";
	
	private static final String mainURL = "https://www.instagram.com/";
	private static final String loginURL= "https://www.instagram.com/accounts/login/ajax/";

	public static void main(String[] args) throws Exception
	{
		Connection.Response mainPage= Jsoup.connect(mainURL).userAgent(USER_AGENT).method(Connection.Method.GET).execute();
		Map<String, String> cookies= mainPage.cookies();
		System.out.println("Cookies: " +  cookies);
		
		// curl "https://www.instagram.com/accounts/login/ajax/" 
		// -H "Host: www.instagram.com" 
		// -H "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:45.0) Gecko/20100101 Firefox/45.0" 
		// -H "Accept: */*" 
		// -H "Accept-Language: en-US,en;q=0.5" 
		// -H "Accept-Encoding: gzip, deflate" 
		// -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" 
		// -H "X-Instagram-AJAX: 1" 
		// -H "X-CSRFToken: 985b80f0ab6b57b6ff07c591d664796e" 
		// -H "X-Requested-With: XMLHttpRequest" 
		// -H "Cookie: csrftoken=985b80f0ab6b57b6ff07c591d664796e; mid=VubN7AAEAAGkESX--tjaAD22umf6" 
		// -H "Connection: keep-alive" 
		// -H "Pragma: no-cache" 
		// -H "Cache-Control: no-cache" 
		// --data "username=mylogin&password=mypassword"
		
		Connection c= Jsoup.connect(loginURL).userAgent(USER_AGENT);
		c.header("X-Requested-With", "XMLHttpRequest");
		c.header("Pragma", "no-cache");
		c.header("Cache-Control", "no-cache");
		c.header("X-Instagram-AJAX", "1");
		c.header("X-CSRFToken", cookies.get("csrftoken") );
		c.data("username", "mylogin", "password", "mypassword");
		Connection.Response login= c.cookies(cookies).method(Connection.Method.POST).execute();
		
		System.out.println("status code= " + login.statusCode() );
	}
}
Du musst nur noch "mylogin" und "mypassword" in Zeile 48 durch Dein Login und Passwort ersetzen.

Bei mir liefert es mangels Instragram-Account nur eine Exception
Code:
Exception in thread "main" org.jsoup.HttpStatusException: HTTP error fetching URL. Status=403, URL=https://www.instagram.com/accounts/login/ajax/
        at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:459)
        at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:434)
        at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:181)
        at IGLogin.main(IGLogin.java:49)

Wenn Du Dich fragst wie ich auf die ganzen Parameter komme:
- Öffne den Firefox-Browser
- Strg-Shift-Q
- "https://www.instagram.com"
- Login + Passwort eingeben

Du siehst dann in der unteren Leiste, welche Daten (URLs + http-Header usw.) hin- und hergeschickt werden, diese Daten musst Du dann nur noch in Java/Jsoup "übersetzen".
Die Kommentarzeilen in meinem Code das Ergebnis eines "Einfügens" nach einem Rechtsklick ("Copy as cURL") auf die Instagram-Login-URL.


HTH

BigNum
 
Zurück
Oben