Jump to content
justb3a

Module: Instagram Feed

Recommended Posts

— Is there a way to update the cache every 60 seconds?

Nope. This module uses the built-in WireCache functionality which defines the following caching periods:

const expireNow = 0;
const expireHourly = 3600; 
const expireDaily = 86400;
const expireWeekly = 604800;
const expireMonthly = 2419200;

— Is it possible to access the "high_resolution" endpoints, even though they aren't already implemented in instagram API (files are there but not implemented)?

This isn't possible, this module just uses the existing instagram endpoints.

  • Like 2

Share this post


Link to post
Share on other sites

Hi, I did just a short look at the instagram api and both implemented endpoints seem to submit a media-id inside the returned array. If this is not the right one, if have no idea as well

{
    "data": [{
        "comments": {
            "count": 0
        },
        ...
        "type": "image",
        "id": "22721881",
        ...
    }]
}

Share this post


Link to post
Share on other sites

My app is kind of a social wall that is running for days/weeks on end and I would like to automate the retrieval of a new access token.
 
Problem: we never know when Instagram might decide to revoke the access token.
 
Once the old one has been revoked, the Instagram API will return error_type=OAuthAccessTokenError. Whenever the response contains this, I would like to generate a new one automatically and save it to the module settings.
 
Looking at the getCode() method, it requires superuser priviliges to get the access token because the redirect URL for getting the code from Instagram lies within the PW admin.
 
So I tink I need to provide a publicly accessible redirect URL to handle the process of aquiring the new access token. Am I heading in the right direction here?
 
(Sorry if this may sound like a silly question. But it is the first time for me working with the Instagram API).
 
EDIT: Sorry, I should have read through the module code more carefully. I think, all it takes to automate retrieval of new access token is modifications to
1. sendRequest method to handle authorization failure and get the new accesstoken
2. getCode method to allow handing back the URL for code retrieval when not logged in as superuser
3. have a module setting to cater for automatic update of access token
 
I will give it a shot and report back here how it goes.
 
2nd EDIT: After doing quite some digging and reading carefully through the Instagram API docs and usage policy, I found that the API is not supposed to be used for automated aquisition of access tokens the way I was originally planning it and the way I can do it eg with Twitter API. Instagram is pretty restrictive  and they clearly state in their Platform Policy

Do not abuse the API Platform, automate requests, or encourage unauthentic behavior. This will get your access turned off.

Various sources state that their access token has been working for quite a long time (up to 3 years). So I don't worry too much about the access token being revoked during the time my social wall will be up.

Anyways, I will cater for the rare case that the access token is invalid at some point in time. I will extend this great module so that the superuser gets notified by email when authentication problems occur during requests to the API. Then they can do a manual refresh of the access token through the link in the module admin interface.

Share this post


Link to post
Share on other sites

To retrieve tagged media with

$media =  $modules->get('InstagramFeed)->getRecentMediaByTag('mytag')

  I had to add scope=public_content to the url for getting the code in the getCode() method:

      $request = array(
        'client_id' => $this->clientId,
        'redirect_uri' => $redirect,
        'response_type' => 'code',
        'scope' => 'public_content'
      );

After that I had to click the 'get Access Token' link again and renew the permissions for the app.

Otherwise I always received an empty result.

In the Instagram API docs they state that the public_content scope is required.

With the module as is now, it only gets the basic permissions in the getCode() method by omitting the scope parameter. (more about scopes in the API docs)

Can anyone confirm that they have successfully received results for the getRecentMediaByTag() call without adding scope=public_content to the 'get Access Token' link url?

Share this post


Link to post
Share on other sites

Hello, 

seems to be the right one. 

Hi, I did just a short look at the instagram api and both implemented endpoints seem to submit a media-id inside the returned array. If this is not the right one, if have no idea as well

{
    "data": [{
        "comments": {
            "count": 0
        },
        ...
        "type": "image",
        "id": "22721881",
        ...
    }]
}

But how to make a call now ? From the Module ? 

I treid do realize it self but my php are not enough for this currently. 

Share this post


Link to post
Share on other sites

@iNoize

To make a call, you need to have the module installed and gone through the process of generating your access token (which is desribed in the module howto).

Then you can make calls from anywhere in yoru templates:

$instagram = $modules->get('InstagramFeed'); // load the module

$userMedia = $instagram->getRecentMedia(); // get media of your user

Then you should have a look at the PHP example to see how you can access values inside $userMedia.

$userMedia is just an example name. You can call that whatever you want. in the PHP example it is called $feed. $feed is an array of the media for that instagram user. You need to loop through that array in a foreach to access the contained media items and extract their properties for display.

Share this post


Link to post
Share on other sites

@gebeer thanks for your advice it works for me like in the examples but what i need is the  last comments self, 

if put out the whole feed 

<pre>
<?php vardump($feed); ?>
</pre>

there are no comments in the array ? So my question was is it possible with this module ? or is it possible to rewrite a litle this module ? 

my php skills are not so good that i could do it self. 

Share this post


Link to post
Share on other sites

@iNoize

getting comments is not implemented in the module. One would have to extend the module code to call the comments endpoint for every media object.

Sorry, but I don't have the time for this right now.

Share this post


Link to post
Share on other sites

@iNoize

getting comments is not implemented in the module. One would have to extend the module code to call the comments endpoint for every media object.

Sorry, but I don't have the time for this right now.

Thanks for testing. Using this endpoint you just get the number of comments, not the comment itself.

["comments"]=>
  array(1) {
    ["count"]=>
    int(1)
}

Share this post


Link to post
Share on other sites

Here you go: new InstagramFeed version 1.0.0  :)

  • add required scope public_content to retrieve tagged media with getRecentMediaByTag('tag') (thanks @gebeer)
  • add ProcessWire 3.x compatibility
  • add endpoint to get a list of recent comments on a media object: getRecentComments($media)

Example:

<?php 
$feed = $modules->get('InstagramFeed')->getRecentMedia(); ?>

<div class="instagram>
  <?php foreach ($feed as $media): ?>
    <?php if ($media['type'] === 'image'): ?>
      <a href="<?=$media['link']; ?>" class="instagram-item">
        <img src="<?=$media['images']['thumbnail']['url']; ?>" alt="">
      </a>

      // display comments
      <?php $comments = $modules->get('InstagramFeed')->getRecentComments($media); ?>
      <?php if ($comments): ?>
        <ul>
          <?php foreach ($comments as $comment): ?>
            <li><?=$comment['text']?></li>
          <?php endforeach; ?>
        </ul>
      <?php endif; ?>
    <?php endif; ?>

  <?php endforeach; ?>
</div>

A comment ($comment in the example above) contains the following data:

"created_time": "1280780324",
"text": "Really amazing photo!",
"from": {
  "username": "snoopdogg",
  "profile_picture": "http://images.instagram.com/profiles/profile_16_75sq_1305612434.jpg",
  "id": "1574083",
  "full_name": "Snoop Dogg"
},
"id": "420"
  • Like 7

Share this post


Link to post
Share on other sites

@justb3a Thanks a lot but something goes wrong there in your example ? 

Ah, thanks for your hint. There was a missing opening `<?php` tag. I corrected the example above as well as the Github readme.

Share this post


Link to post
Share on other sites
On 15.6.2016 at 11:24 AM, justb3a said:

Ah, thanks for your hint. There was a missing opening `<?php` tag. I corrected the example above as well as the Github readme.

Hello, i get alway NULL or Array(0) dont really work ? 

have you tried your code ? maybe is something wrong in the access token  ? 

 

Share this post


Link to post
Share on other sites
17 hours ago, iNoize said:

have you tried your code ?

No. Never. Should I? From time to time I dream about some code someone might need and put it inside a module :D:D :) 

 

Thanks @LostKobrakai for pointing out the sandbox mode. more about sandbox mode

 

  • Like 2

Share this post


Link to post
Share on other sites

I'm getting the following warning when trying to render the feed:

Warning: constant(): Couldn't find constant WireCache::expireWeekly in/path/to/public_html/site/assets/cache/FileCompiler/site/modules/InstagramFeed/InstagramFeed.module on line 286

I am running PW version 3.0.33.

Any thoughts what might be causing this?

Thanks for the help!

Share this post


Link to post
Share on other sites

Hm... I still seem to be having issues.

I'm getting: Warning: Invalid argument supplied for foreach()

When trying to loop the instagram posts. I'm trying to get posts by method getRecentMediaByTag

Any thoughts?

Share this post


Link to post
Share on other sites

Could you please output the variable before starting the foreach loop (var_dump($feed);). I guess it's empty. Are you sure that the generation of the access token has gone right?

Share this post


Link to post
Share on other sites

I get NULL when I do a var_dump.

I have a Client ID and Secret, then saved the page. Then came back and then clicked get access token and re-saved.

I've just tried clearing the access token, regenerating the Client secret saving the page and then getting the access token again but I'm still getting NULL.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By gebeer
      Although the PW backend is really intuitive, ever so often my clients need some assistance. Be it they are not so tech savvy or they are not working in the backend often.
      For those cases it is nice to make some help videos available to editors. This is what this module does.
      ProcessHelpVideos Module
      A Process module to display help videos for the ProcessWire CMS. It can be used to make help videos (screencasts) available to content editors.
      This module adds a 'Help Videos" section to the ProcessWire backend. The help videos are accessible through an automatically created page in the Admin page tree. You can add your help videos as pages in the page tree. The module adds a hidden page to the page tree that acts as parent page for the help video pages. All necessary fields and templates will be installed automatically. If there are already a CKEditor field and/or a file field for mp4 files installed in the system, the module will use those. Otherwise it will create the necessary fields. Also the necessary templates for the parent help videos page and it's children are created on module install. The module installs a permission process-helpvideos. Every user role that should have access to the help video section, needs this permission. I use the help video approach on quite a few production sites. It is stable so far and well received by site owners/editors. Up until now I installed required fields, templates and pages manually and then added the module. Now I added all this logic to the install method of the module and it should be ready to share.
      The module and further description on how to use it is available on github: https://github.com/gebeer/ProcessHelpVideos
      If you like to give it a try, I am happy to receive your comments/suggestions here.
    • By Robin S
      A module created in response to the topic here:
      Page List Select Multiple Quickly
      Modifies PageListSelectMultiple to allow you to select multiple pages without the tree closing every time you select a page.
      The screencast says it all:

       
      https://github.com/Toutouwai/PageListSelectMultipleQuickly
      https://modules.processwire.com/modules/page-list-select-multiple-quickly/
    • By gebeer
      Hello all,
      sharing my new module FieldtypeImagePicker. It provides a configurable input field for choosing any type of image from a predefined folder.
      The need for it came up because a client had a custom SVG icon set and I wanted the editors to be able to choose an icon in the page editor.
      It can also be used to offer a choice of images that are used site-wide without having to upload them to individual pages.
      There are no image manipulation methods like with the native PW image field.
      Module and full description can be found on github https://github.com/gebeer/FieldtypeImagePicker
      Kudos to @Martijn Geerts. I used his module FieldTypeSelectFile as a base to build upon.
      Here's how the input field looks like in the page editor:

      Hope it can be of use to someone.
      If you like to give it a try, I'm happy to hear your comments or suggestions for improvement. Eventually this will go in the module directory soon, too.
    • By bernhard
      @Sergio asked about the pdf creation process in the showcase thread about my 360° feedback/survey tool and so I went ahead and set my little pdf helper module to public.
      Description from PW Weekly:
       
      Modules Directory: https://modules.processwire.com/modules/rock-pdf/
      Download & Docs: https://github.com/BernhardBaumrock/RockPDF
       
      You can combine it easily with RockReplacer: 
      See also a little showcase of the RockPdf module in this thread:
       
    • By ukyo
      FieldtypeFontIconPicker
      Supported Icon Libraries
      FontAwesome 4.7.0 Uikit 3.0.34 IonicIcons 2.0.1 Cahangelog
      NOTE: Module store data without prefix, you need to add "prefix" when you want to show your icon on front-end, because some of front-end frameworks using font-awesome with different "prefix".
      Module will search site/modules/**/configs/IconPicker.*.php and site/templates/IconPicker.*.php paths for FieldtypeFontIconPicker config files.
      All config files need to return a PHP ARRAY like examples.
      Example config file : create your own icon set.
      File location is site/configs/IconPicker.example.php
      <?php namespace ProcessWire; /** * IconPicker : Custom Icons */ return [ "name" => "my-custom-icons", "title" => "My Custom Icon Set", "version" => "1.0.0", "styles" => array( wire("config")->urls->templates . "dist/css/my-custom-icons.css" ), "scripts" => array( wire("config")->urls->templates . "dist/js/my-custom-icons.js" ), "categorized" => true, "attributes" => array(), "icons" => array( "brand-icons" => array( "title" => "Brand Icons", "icons" => array( "google", "facebook", "twitter", "instagram" ) ), "flag-icons" => array( "title" => "Flag Icons", "icons" => array( "tr", "gb", "us", "it", "de", "nl", "fr" ) ) ) ]; Example config file : use existing and extend it.
      File location is site/configs/IconPicker.altivebir.php
      <?php namespace ProcessWire; /** * IconPicker : Existing & Extend */ $resource = include wire("config")->paths->siteModules . "FieldtypeFontIconPicker/configs/IconPicker.uikit.php"; $url = wire("config")->urls->templates . "dist"; $resource["scripts"] = array_merge($resource["scripts"], ["{$url}/js/Altivebir.Icon.min.js"]); $resource["icons"]["flag-icons"] = [ "title" => "Flag Icons", "icons" => array("tr", "en", "fr", "us", "it", "de") ]; $resource["icons"]["brand-icons"]["icons"] = array_merge($resource["icons"]["brand-icons"]["icons"], array( "altivebir" )); return $resource; After you add your custom config file, you will see your config file on library select box. Library Title (Location Folder Name).

      If your library categorized and if you have categorized icons set like uikit and fontawesome libraries, you will have category limitation options per icon field or leave it empty for allow all categories (default).

      Example : output
      if ($icon = $page->get("iconField")) { echo "<i class='prefix-{$icon}' />"; } MarkupFontIconPicker Usage
      // MarkupFontIconPicker::render(YourIconField=string, Options=array) echo MarkupFontIconPicker::render($page->YourIconField, [ 'prefix' => 'uk-icon-', // Icon class prefix, if you have different prefix, default is : "fa fa-" 'tag' => 'span', // Icon tag default is : "i" 'class' => 'fa-lg', // If you have extra cutom classes, for example : icons sizes, Array or Sting value 'style' => 'your custom styles if you have' // Array or String Value ]); Theme support

      Search support

      Category support

       
×
×
  • Create New...