web-dev-qa-db-ja.com

Instagramに画像を投稿する

質問:私のアプリでは、FBやTwitterのようにInstagramに画像を投稿する必要があります。

既に行ったこと:Instagramからログインして自分のアプリに写真を取得します。しかし、Instagramに画像を投稿する方法がありません。

16
Akhilesh Mani

しかし、FBやTwitterなどのInstagramに画像を投稿することはできません。

しかし、これは、すでにインストールされているInstagramを使用してこれを実現するもう1つの方法であり、そうでない場合、ユーザーにアプリをダウンロードするよう通知します。

 public void onClick(View v) {

        Intent intent = getPackageManager().getLaunchIntentForPackage("com.instagram.Android");
        if (intent != null)
        {
            Intent shareIntent = new Intent();
            shareIntent.setAction(Intent.ACTION_SEND);
            shareIntent.setPackage("com.instagram.Android");
            try {
                shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), imagePath, "I am Happy", "Share happy !")));
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            shareIntent.setType("image/jpeg");

            startActivity(shareIntent);
        }
        else
        {
            // bring user to the market to download the app.
            // or let them choose an app?
            intent = new Intent(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setData(Uri.parse("market://details?id="+"com.instagram.Android"));
            startActivity(intent);
        }

    }
35
Akhilesh Mani

いいえ、できません。 Instagram API docs から引用:

現時点では、APIを介したアップロードはできません。次の理由により、これを追加しないことを意識的に選択しました。

  1. Instagramは、外出先でのあなたの人生をテーマにしています。アプリ内から写真を投稿してください。ただし、将来的には個別のアプリへのホワイトリストアクセスをケースバイケースで許可する可能性があります。
  2. スパムや低品質の写真に対抗したい。他のソースからのアップロードを許可すると、Instagramのエコシステムに何が入るかを制御することが難しくなります。以上のことを踏まえて、私たちはユーザーがプラットフォーム上で一貫した高品質のエクスペリエンスを確実に利用できるようにする方法に取り組んでいます。

UPDATE:ただし、iOSで作業している場合(Androidにタグを付けた場合)、写真を「送信」する方法があります(実際、カスタムURLスキームを介してInstagramで画像を開きます。 this を参照してください。

13
Raptor

このリンクを試してください:

このクラスを使用して、画像をInstagramにアップロードできます。

import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStreamReader;
import Java.io.UnsupportedEncodingException;
import Java.net.HttpCookie;
import Java.net.MalformedURLException;
import Java.net.URL;
import Java.net.URLEncoder;
import Java.util.Date;
import Java.util.List;
import Java.util.Map;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.net.ssl.HttpsURLConnection;

import org.Apache.commons.codec.binary.Hex;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class InstagramPostHelper {

    private static InstagramPostHelper instance = null;

    protected InstagramPostHelper() {}

    public static InstagramPostHelper getInstance() {
        if (instance == null) {
            instance = new InstagramPostHelper();
        }
        return instance;
    }

    private String GenerateSignature(String value, String key) 
    {
        String result = null;
        try {
            byte[] keyBytes = key.getBytes();
            SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA256");
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(signingKey);
            byte[] rawHmac = mac.doFinal(value.getBytes());
            byte[] hexBytes = new Hex().encode(rawHmac);
            result = new String(hexBytes, "UTF-8");
    }
    catch (Exception e) {

    }
        return result;

    }

    private static final String COOKIES_HEADER = "Set-Cookie";
    public static Java.net.CookieManager msCookieManager = new Java.net.CookieManager();
    private HttpsURLConnection conn;

    private static String TextUtilsJoin(CharSequence delimiter, List<HttpCookie> list) {
            StringBuilder sb = new StringBuilder();
            boolean firstTime = true;
            for (Object token: list) {

                if (token.toString().trim().length()<1) continue;

                if (firstTime) {
                    firstTime = false;
                } else {
                    sb.append(delimiter + " ");
                }

                sb.append(token);

            }
            return sb.toString();
        }


    private String GetJSONStringAndPostData(String jsonaddress,String postdata,String agent)
    {
        String sonuc = "";
        try {

            byte[] postDataBytes = postdata.toString().getBytes("UTF-8");


            URL url = new URL(jsonaddress);


            conn = (HttpsURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
            conn.setRequestProperty("User-Agent", agent);

            //Set Cookies
            if(msCookieManager.getCookieStore().getCookies().size() > 0)
            {
              conn.setRequestProperty("Cookie", TextUtilsJoin(";",  msCookieManager.getCookieStore().getCookies()));    
            }

            conn.setDoOutput(true);
            conn.getOutputStream().write(postDataBytes);

            if (conn.getResponseCode() != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + conn.getResponseCode());
            }

            //Get Cookies
            Map<String, List<String>> headerFields = conn.getHeaderFields();
            List<String> cookiesHeader = headerFields.get(COOKIES_HEADER);
            if(cookiesHeader != null)
            {
                for (String cookie : cookiesHeader) 
                {
                  msCookieManager.getCookieStore().add(null,HttpCookie.parse(cookie).get(0));
                }               
            }



            BufferedReader br = new BufferedReader(new InputStreamReader(
                (conn.getInputStream())));
            String output;
            while ((output = br.readLine()) != null) {
                sonuc += output;
            }
            conn.disconnect();
          } catch (MalformedURLException e) {
            return "";
          } catch (IOException e) {
            return "";
          }
        return sonuc;
    }

    public void SendImage(String Caption,byte[] ImageByteArray) throws UnsupportedEncodingException, ParseException
    {
        String Agent = "Instagram 6.21.2 Android (19/4.4.2; 480dpi; 1152x1920; Meizu; MX4; mx4; mt6595; en_US)";
        String Guid = Java.util.UUID.randomUUID().toString();
        String DeviceId = "Android-" + Guid;
        String Data = "{\"device_id\":\""  +  DeviceId + "\",\"guid\":\"" + Guid + "\",\"username\":\"MYUSERNAME\",\"password\":\"MYPASSWORD\",\"Content-Type\":\"application/x-www-form-urlencoded; charset=UTF-8\"}"; 
        String Sig = GenerateSignature(Data, "25eace5393646842f0d0c3fb2ac7d3cfa15c052436ee86b5406a8433f54d24a5");
        Data  = "signed_body=" + Sig + "." +  URLEncoder.encode(Data, "UTF-8") + "&ig_sig_key_version=4";

        if (msCookieManager.getCookieStore()!= null)
        {
            msCookieManager.getCookieStore().removeAll();
        }
        //Login Request
        String login = GetJSONStringAndPostData("https://instagram.com/api/v1/accounts/login/", Data,Agent);

        JSONParser parser = new JSONParser();
        Object obj = parser.parse(login);
        JSONObject jsonObject = (JSONObject) obj;
        if (((String) jsonObject.get("status")).equals("ok")) //Login SuccessFul
        {
            //Login Successful
            System.out.println("Login Successful !");

           //Post Image
            String upload = "";

            try {
                final HttpMultipartHelper http = new HttpMultipartHelper(new URL("https://instagram.com/api/v1/media/upload/"));
                http.addFormField("device_timestamp", Long.toString((new Date()).getTime()));
                http.addFilePart("photo", ImageByteArray);
                final byte[] bytes = http.finish();
                upload = new String(bytes);
            } catch (IOException e) {
                e.printStackTrace();
            }


            System.out.println(upload);
            obj = parser.parse(upload);
            jsonObject = (JSONObject) obj;
            if (((String) jsonObject.get("status")).equals("ok")) //Login SuccessFul
            {
                String mediaID = (String) jsonObject.get("media_id");

                Data = "{\"device_id\":\"" + DeviceId + "\",\"guid\":\"" + Guid + "\",\"media_id\":\"" + mediaID + "\",\"caption\":\"" + Caption + "\",\"device_timestamp\":\"" + Long.toString((new Date()).getTime()).substring(0,10) + "\",\"source_type\":\"5\",\"filter_type\":\"0\",\"extra\":\"{}\",\"Content-Type\":\"application/x-www-form-urlencoded; charset=UTF-8\"}";
                Sig = GenerateSignature(Data, "25eace5393646842f0d0c3fb2ac7d3cfa15c052436ee86b5406a8433f54d24a5");

                Data  = "signed_body=" + Sig + "." +  URLEncoder.encode(Data, "UTF-8") + "&ig_sig_key_version=6";

                //Login Request
                System.out.println(Data);
                String result = GetJSONStringAndPostData("https://instagram.com/api/v1/media/configure/", Data,Agent);

                System.out.println(result);
            }


        }
        else //Login UnsuccessFul
        {
            System.out.println("Login Unsuccessful !" + login);
        }


    }

}

https://Gist.github.com/ecdundar/d5b6bdcc2035448fc9cd

0
Ecd

これを試してください

public void ShareInsta() {



    File dir = new File(Environment.getExternalStorageDirectory(), "FolderName");
    File imgFile = new File(dir, "0.png");
    Intent sendIntent = new Intent(Intent.ACTION_VIEW);
    sendIntent.setType("image/*");
    sendIntent.setAction(Intent.ACTION_SEND);
    sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + imgFile));
    sendIntent.putExtra(Intent.EXTRA_TEXT, "<---MY TEXT--->.");
    sendIntent.setPackage("com.instagram.Android");
    sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    try {
        startActivity(Intent.createChooser(sendIntent, "Share images..."));
    } catch (Android.content.ActivityNotFoundException ex) {
        Toast.makeText(SaveAndShareActivity.this, "Please Install Instagram", Toast.LENGTH_LONG).show();
    }

}
0
DEVSHK

できるようになったようです。詳細については、こちらをご覧ください 公式ドキュメントはこちら

0
mert