Creating an IG top 9 without using creepy 3rd party apps

It’s that time of year again when everyone on Instagram is posting their #top9. I wanted one too, but I don’t trust whatever app people are authenticating with their Instagram accounts because it shares more with a 3rd party than I care to do. (TL;DR: use the script in this gist)

Fortunately, a quick googling led me to the igramscraper python library

Then the first step was using it’s get_medias function:

<span>posts</span> <span>=</span> <span>instagram</span><span>.</span><span>get_medias</span><span>(</span><span>"_schep"</span><span>,</span> <span>50</span><span>)</span> <span># use your account of course! </span>
<span>posts</span> <span>=</span> <span>instagram</span><span>.</span><span>get_medias</span><span>(</span><span>"_schep"</span><span>,</span> <span>50</span><span>)</span> <span># use your account of course! </span>
posts = instagram.get_medias("_schep", 50) # use your account of course!

Enter fullscreen mode Exit fullscreen mode

Next, we need to filter to only this year’s photos and sort by likes and grab the top 9. For this we use the standard library datetime module, a list comprehension, sorted and a slice to limit the result to 9.

<span>this_year_photos</span> <span>=</span> <span>[</span>
<span>post</span>
<span>for</span> <span>post</span> <span>in</span> <span>posts</span>
<span>if</span> <span>datetime</span><span>.</span><span>fromtimestamp</span><span>(</span><span>post</span><span>.</span><span>created_time</span><span>).</span><span>year</span> <span>==</span> <span>2019</span>
<span>and</span> <span>post</span><span>.</span><span>type</span> <span>==</span> <span>post</span><span>.</span><span>TYPE_IMAGE</span>
<span>]</span>
<span>top9</span> <span>=</span> <span>sorted</span><span>(</span><span>this_year_photos</span><span>,</span> <span>key</span><span>=</span><span>lambda</span> <span>post</span><span>:</span> <span>-</span><span>post</span><span>.</span><span>likes_count</span><span>)[:</span><span>9</span><span>]</span>
<span>this_year_photos</span> <span>=</span> <span>[</span>
    <span>post</span>
    <span>for</span> <span>post</span> <span>in</span> <span>posts</span>
    <span>if</span> <span>datetime</span><span>.</span><span>fromtimestamp</span><span>(</span><span>post</span><span>.</span><span>created_time</span><span>).</span><span>year</span> <span>==</span> <span>2019</span>
    <span>and</span> <span>post</span><span>.</span><span>type</span> <span>==</span> <span>post</span><span>.</span><span>TYPE_IMAGE</span>
<span>]</span>

<span>top9</span> <span>=</span> <span>sorted</span><span>(</span><span>this_year_photos</span><span>,</span> <span>key</span><span>=</span><span>lambda</span> <span>post</span><span>:</span> <span>-</span><span>post</span><span>.</span><span>likes_count</span><span>)[:</span><span>9</span><span>]</span>
this_year_photos = [ post for post in posts if datetime.fromtimestamp(post.created_time).year == 2019 and post.type == post.TYPE_IMAGE ] top9 = sorted(this_year_photos, key=lambda post: -post.likes_count)[:9]

Enter fullscreen mode Exit fullscreen mode

Now we have a list of your top 9 most liked photos of 2019! Next we need to download them and create your top9 image. For this we use the popular requests and Pillow libraries:

<span>img</span> <span>=</span> <span>Image</span><span>.</span><span>new</span><span>(</span><span>"RGB"</span><span>,</span> <span>(</span><span>1080</span><span>,</span> <span>1080</span><span>))</span> <span># create the new image </span><span>for</span> <span>post</span> <span>in</span> <span>top9</span><span>:</span>
<span># download and open the image </span> <span>tile</span> <span>=</span> <span>Image</span><span>.</span><span>open</span><span>(</span><span>requests</span><span>.</span><span>get</span><span>(</span><span>post</span><span>.</span><span>image_high_resolution_url</span><span>,</span> <span>stream</span><span>=</span><span>True</span><span>).</span><span>raw</span><span>)</span>
<span># resize the image </span> <span>tile</span> <span>=</span> <span>tile</span><span>.</span><span>resize</span><span>((</span><span>360</span><span>,</span> <span>360</span><span>),</span> <span>Image</span><span>.</span><span>ANTIALIAS</span><span>)</span>
<span># paste it into our new image </span> <span>img</span><span>.</span><span>paste</span><span>(</span><span>tile</span><span>,</span> <span>(</span><span>i</span> <span>%</span> <span>3</span> <span>*</span> <span>360</span><span>,</span> <span>i</span> <span>//</span> <span>3</span> <span>*</span> <span>360</span><span>))</span>
<span>img</span> <span>=</span> <span>Image</span><span>.</span><span>new</span><span>(</span><span>"RGB"</span><span>,</span> <span>(</span><span>1080</span><span>,</span> <span>1080</span><span>))</span> <span># create the new image </span><span>for</span> <span>post</span> <span>in</span> <span>top9</span><span>:</span>
    <span># download and open the image </span>    <span>tile</span> <span>=</span> <span>Image</span><span>.</span><span>open</span><span>(</span><span>requests</span><span>.</span><span>get</span><span>(</span><span>post</span><span>.</span><span>image_high_resolution_url</span><span>,</span> <span>stream</span><span>=</span><span>True</span><span>).</span><span>raw</span><span>)</span>
    <span># resize the image </span>    <span>tile</span> <span>=</span> <span>tile</span><span>.</span><span>resize</span><span>((</span><span>360</span><span>,</span> <span>360</span><span>),</span> <span>Image</span><span>.</span><span>ANTIALIAS</span><span>)</span>
    <span># paste it into our new image </span>    <span>img</span><span>.</span><span>paste</span><span>(</span><span>tile</span><span>,</span> <span>(</span><span>i</span> <span>%</span> <span>3</span> <span>*</span> <span>360</span><span>,</span> <span>i</span> <span>//</span> <span>3</span> <span>*</span> <span>360</span><span>))</span>
img = Image.new("RGB", (1080, 1080)) # create the new image for post in top9: # download and open the image tile = Image.open(requests.get(post.image_high_resolution_url, stream=True).raw) # resize the image tile = tile.resize((360, 360), Image.ANTIALIAS) # paste it into our new image img.paste(tile, (i % 3 * 360, i // 3 * 360))

Enter fullscreen mode Exit fullscreen mode

The call to img.paste is a little bit obtuse. I’m using the modulo(%) operator to determine what column the image is on then multiplying by the size of the image and using the floor division(//) operator to determine the row.

Then we save it!

<span>img</span><span>.</span><span>save</span><span>(</span><span>"my-top9.jpg"</span><span>)</span>
<span>img</span><span>.</span><span>save</span><span>(</span><span>"my-top9.jpg"</span><span>)</span>
img.save("my-top9.jpg")

Enter fullscreen mode Exit fullscreen mode

If you have non-square images in your top 9, you might notice that they are deformed. To deal with this, we crop our tile before resizing it:

<span>if</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>0</span><span>]</span> <span>></span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>1</span><span>]:</span>
<span>tile</span> <span>=</span> <span>tile</span><span>.</span><span>crop</span><span>(</span>
<span>(</span>
<span>(</span><span>tile</span><span>.</span><span>size</span><span>[</span><span>0</span><span>]</span> <span>-</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>1</span><span>])</span> <span>/</span> <span>2</span><span>,</span>
<span>0</span><span>,</span>
<span>(</span><span>tile</span><span>.</span><span>size</span><span>[</span><span>0</span><span>]</span> <span>-</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>1</span><span>])</span> <span>/</span> <span>2</span> <span>+</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>1</span><span>],</span>
<span>tile</span><span>.</span><span>size</span><span>[</span><span>1</span><span>],</span>
<span>)</span>
<span>)</span>
<span>elif</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>0</span><span>]</span> <span><</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>1</span><span>]:</span>
<span>tile</span> <span>=</span> <span>tile</span><span>.</span><span>crop</span><span>(</span>
<span>(</span>
<span>0</span><span>,</span>
<span>(</span><span>tile</span><span>.</span><span>size</span><span>[</span><span>1</span><span>]</span> <span>-</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>0</span><span>])</span> <span>/</span> <span>2</span><span>,</span>
<span>tile</span><span>.</span><span>size</span><span>[</span><span>0</span><span>],</span>
<span>(</span><span>tile</span><span>.</span><span>size</span><span>[</span><span>1</span><span>]</span> <span>-</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>0</span><span>])</span> <span>/</span> <span>2</span> <span>+</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>0</span><span>],</span>
<span>)</span>
<span>)</span>
<span>if</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>0</span><span>]</span> <span>></span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>1</span><span>]:</span>
    <span>tile</span> <span>=</span> <span>tile</span><span>.</span><span>crop</span><span>(</span>
        <span>(</span>
            <span>(</span><span>tile</span><span>.</span><span>size</span><span>[</span><span>0</span><span>]</span> <span>-</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>1</span><span>])</span> <span>/</span> <span>2</span><span>,</span>
            <span>0</span><span>,</span>
            <span>(</span><span>tile</span><span>.</span><span>size</span><span>[</span><span>0</span><span>]</span> <span>-</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>1</span><span>])</span> <span>/</span> <span>2</span> <span>+</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>1</span><span>],</span>
            <span>tile</span><span>.</span><span>size</span><span>[</span><span>1</span><span>],</span>
        <span>)</span>
    <span>)</span>
<span>elif</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>0</span><span>]</span> <span><</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>1</span><span>]:</span>
    <span>tile</span> <span>=</span> <span>tile</span><span>.</span><span>crop</span><span>(</span>
        <span>(</span>
            <span>0</span><span>,</span>
            <span>(</span><span>tile</span><span>.</span><span>size</span><span>[</span><span>1</span><span>]</span> <span>-</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>0</span><span>])</span> <span>/</span> <span>2</span><span>,</span>
            <span>tile</span><span>.</span><span>size</span><span>[</span><span>0</span><span>],</span>
            <span>(</span><span>tile</span><span>.</span><span>size</span><span>[</span><span>1</span><span>]</span> <span>-</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>0</span><span>])</span> <span>/</span> <span>2</span> <span>+</span> <span>tile</span><span>.</span><span>size</span><span>[</span><span>0</span><span>],</span>
        <span>)</span>
    <span>)</span>
if tile.size[0] > tile.size[1]: tile = tile.crop( ( (tile.size[0] - tile.size[1]) / 2, 0, (tile.size[0] - tile.size[1]) / 2 + tile.size[1], tile.size[1], ) ) elif tile.size[0] < tile.size[1]: tile = tile.crop( ( 0, (tile.size[1] - tile.size[0]) / 2, tile.size[0], (tile.size[1] - tile.size[0]) / 2 + tile.size[0], ) )

Enter fullscreen mode Exit fullscreen mode

We’ve just created our own top9 image with out having to authenticate our account with a creep 3rd party IG app!

Check out the full source code for an easy to use version of this script in this Gist:

原文链接:Creating an IG top 9 without using creepy 3rd party apps

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
The world is like a mirror: Frown at itand it frowns at you; smile, and it smiles too.
世界犹如一面镜子:朝它皱眉它就朝你皱眉,朝它微笑它也吵你微笑
评论 抢沙发

请登录后发表评论

    暂无评论内容